写给码农和运维的容器(docker)基本指南

网友投稿 945 2022-10-02

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

写给码农和运维的容器(docker)基本指南

随着云和虚拟技术发展,容器成了当下最耀眼的虚拟化明珠。然而什么是容器呢?本文虫虫就来给大家科普一下容器。

概述

实际上Linux容器技术由来已久,Linux老早就支持了容器特性,也有了系统级容器技术LXC和LXD。传统的Linux容器实际上只是Linux系统上的普通进程。这些进程组被使用资源约束(cgroups),安全约束(Unix权限,capabilities,SELinux,AppArmor,seccomp等)和命名空间(PID,网络,mount,等等)隔离出来。

如果启动Linux系统,在其内存空间可以查看这些隔离:

Cgroup:/proc/PID/cgroup

capabilities: proc/PID/status

SELinux标志:/proc/self/attr/current

命名空间:/proc/PID/ns

因此,如果要将容器定义为具有资源限制,Linux安全性约束和命名空间的进程,根据定义,Linux上的每个进程都在一个容器中。这就是为什么经常说"Linux是容器,容器是Linux"。

容器运行时是修改这些资源约束,安全性和命名空间并启动容器的工具。docker就是最常见的容器运行时。

容器镜像

Docker引入了容器镜像的概念,这是一个标准的TAR包,其中包括:

Rootfs(容器根文件系统):系统上看起来像操作系统的标准根(/)的目录。例如,带有/usr,/var,/home等的目录。

JSON文件(容器配置):用来指定如何运行rootfs。例如,容器启动时在rootfs中运行的命令或入口点;为容器设置的环境变量;容器的工作目录;和一些其他设置。

镜像分层

Docker打包了rootfs和JSON文件来创建基本镜像。这样就可以在rootfs上安装其他内容,创建新的JSON文件,并使用更新的JSON文件来解决原始镜像与新镜像之间的差异。这样就创建一个分层的镜像。

OCI镜像规范

容器镜像的定义最终由Open Container Initiative(OCI)标准组织标准化为OCI镜像规范。

构建工具

用于创建容器镜像的工具称为容器镜像构建器。有时容器引擎执行此任务,但可以使用几个可以构建容器镜像的独立工具。比如docker --build,buidah等。

容器注册表

Docker接受了这些容器镜像(tarball)并将它们移动到一个Web服务,从中可以提取它们,开发一个协议来提取它们,并将Web服务称为容器注册表(Registry),比如Docker Hub。

容器存储

容器存储通常是copy-on-write(COW)分层文件系统。从容器注册表中下载容器镜像时,首先需解压rootfs并将其放在磁盘上。如果有多个构成镜像的图层,则会下载所有图层并将其存储在COW文件系统的不同图层上。COW文件系统允许每个层单独存储,这最大化了分层镜像的共享。容器引擎通常支持多种类型的容器存储,包括overlay,devicemapper,btrfs,aufs和zfs。

在容器引擎将容器镜像下载到容器存储之后,它需要创建容器运行时配置。运行时配置组合来自调用者/用户的输入以及容器镜像规范的内容。例如,调用者可能希望指定对正在运行的容器的安全性的修改,添加其他环境变量或将卷装入容器。

OCI标准组织还将容器运行时配置和发布的rootfs的布局标准化为OCI运行时规范。

容器引擎

容器引擎(Container engines)是可以从容器注册表中提取容器镜像并将它们重新组装到容器存储上的程序。容器引擎也启动容器运行时。

容器引擎启动一个读取容器运行时规范的容器运行时;修改Linux cgroups,Linux安全性约束和命名空间;并启动容器命令以创建容器的PID 1进程。此时,容器引擎可以将stdin/stdout中继回调用者并控制容器(例如:停止,启动,附加)。

目前正在引入许多新的容器运行时以使用Linux的不同部分来隔离容器。人们现在可以使用KVM分离(比如迷你虚拟机)运行容器,或者他们可以使用其他管理程序策略(例如拦截来自容器中进程的所有系统调用)。由于有了一个标准的运行时规范,这些工具都可以由相同的容器引擎启动。甚至Windows也可以使用OCI运行时规范来启动Windows容器。

容器编排

更高层次的是容器编排器(比如K8s和Docker Swarm)。容器编排器是用于协调多个不同节点上的容器执行的工具。容器编排器与容器引擎通信以管理容器。编排器告诉容器引擎启动容器并将它们的网络连接在一起。编排器可以监控容器并在负载增加时启动其他容器。

上一篇:华为GaussDB A ALTER FUNCTION
下一篇:PostgreSQL:您可能需要增加MAX_LOCKS_PER_TRANSACTION
相关文章

 发表评论

暂时没有评论,来抢沙发吧~