认识
一、认识
Docker
最初是一个单体引擎,主要负责容器镜像的制作、上传、拉取及容器的运行及管理。随着容器技术的繁荣与发展,为了促进容器技术相关的规范生成和 Docker
自身的项目发展,Docker
将单体引擎拆分为三部分, 分别为 runC
、containerd
和 dockerd
。其中:
-
runC
: 主要负责容器的运行和生命周期的管理(低层运行时) -
containerd
: 主要负责容器镜像的下载和解压等镜像管理功能(高层运行时) -
dockerd
: 主要负责提供镜像制作、上传等功能同时提供容器存储和网络的映射功能,同时也是Docker
服务器端的守护进程,用来响应Docker
客户端(命令行CLI
工具)发来的各种容器、镜像管理的任务。
Docker
公司将 runC
捐献给了 OCI
, 将 containerd
捐献给了 CNCF
, 剩下的 dockerd
作为 Docker
运行时由 Docker
公司自己维护。
二、容器运行机制
当我们使用 docker run
运行一个命令在容器中时,在容器运行时层面会发生什么?
-
如果本地没有镜像,则从镜像登记仓库
registry
拉取镜像 -
镜像被提取到一个写时复制
COW
的文件系统上,所有的容器层相互堆叠以形成一个合并的文件系统 -
为容器准备一个挂载点
-
从容器镜像中设置元数据,包括诸如覆盖
CMD
、来自用户输入的ENTRYPOINT
、设置SECCOMP
规则等设置,以确保容器按预期运行 -
提醒内核为该容器分配某种隔离,如进程、网络和文件系统(命名空间(
namespace
)) -
提醒内核为该容器分配一些资源限制,如
CPU
或内存限制(控制组(cgroup
)) -
传递一个系统调用
syscall
给内核用于启动容器 -
设置
SELinux/AppArmor
以上,就是容器运行时负责的所有工作。当我们提及容器运行时,想到的可能是 runc
、lxc
、containerd
、rkt
、cri-o
等等。这些都是容器引擎和容器运行时,每一种都是为不同的情况建立的。