跳到主要内容

认识

2024年05月14日
柏拉文
越努力,越幸运

一、认识


Docker 最初是一个单体引擎,主要负责容器镜像的制作、上传、拉取及容器的运行及管理。随着容器技术的繁荣与发展,为了促进容器技术相关的规范生成和 Docker 自身的项目发展,Docker 将单体引擎拆分为三部分, 分别为 runCcontainerddockerd。其中:

  • runC: 主要负责容器的运行和生命周期的管理(低层运行时)

  • containerd: 主要负责容器镜像的下载和解压等镜像管理功能(高层运行时)

  • dockerd: 主要负责提供镜像制作、上传等功能同时提供容器存储和网络的映射功能,同时也是 Docker 服务器端的守护进程,用来响应 Docker 客户端(命令行 CLI 工具)发来的各种容器、镜像管理的任务。

Docker 公司将 runC 捐献给了 OCI, 将 containerd 捐献给了 CNCF, 剩下的 dockerd 作为 Docker 运行时由 Docker 公司自己维护。

二、容器运行机制


当我们使用 docker run 运行一个命令在容器中时,在容器运行时层面会发生什么?

  1. 如果本地没有镜像,则从镜像登记仓库 registry 拉取镜像

  2. 镜像被提取到一个写时复制 COW 的文件系统上,所有的容器层相互堆叠以形成一个合并的文件系统

  3. 为容器准备一个挂载点

  4. 从容器镜像中设置元数据,包括诸如覆盖CMD、来自用户输入的ENTRYPOINT、设置 SECCOMP 规则等设置,以确保容器按预期运行

  5. 提醒内核为该容器分配某种隔离,如进程、网络和文件系统(命名空间(namespace))

  6. 提醒内核为该容器分配一些资源限制,如 CPU 或内存限制(控制组(cgroup))

  7. 传递一个系统调用 syscall 给内核用于启动容器

  8. 设置 SELinux/AppArmor

以上,就是容器运行时负责的所有工作。当我们提及容器运行时,想到的可能是 runclxccontainerdrktcri-o 等等。这些都是容器引擎和容器运行时,每一种都是为不同的情况建立的。