[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-detail-ssr-45262545967123468":3},{"id":4,"title":5,"tag":6,"createTime":7,"updateTime":8,"renderedHtml":9,"description":10,"ogImageUrl":11},"45262545967123468","docker 引擎发展历史","Docker","2023-11-09","2025-01-22","\u003Cp>现代 Docker 引擎由如下主要的组件构成：Docker 客户端（Docker Client）、Docker 守护进程（Docker daemon）、containerd 以及 runc。它们共同负责容器的创建和运行。下面是 Docker 引擎的发展过程：\u003C\u002Fp>\n\u003Ch2 id=\"h2-0-\">首发版本\u003C\u002Fh2>\n\u003Cp>Docker 首次发布时，Docker 引擎由两个核心组件构成：\u003Ccode>LXC\u003C\u002Fcode> 和 \u003Ccode>Docker daemon\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>其中，Linux 容器（LXC）是第一个、最完整的 Linux 容器管理器的实现方案。2008 年，通过将 Cgroups 的资源管理能力和 Linux Namespace 的视图隔离能力组合在一起，LXC 完整的容器技术出现在 Linux 内核中，并且可以在单个 Linux 内核上运行而无需任何补丁。而 Docker daemon 是单一的二进制文件，包含诸如 Docker 客户端、Docker API、容器运行时、镜像构建等。\u003C\u002Fp>\n\u003Cp>下图阐释了在 Docker 旧版本中，Docker daemon、LXC 和操作系统之间的交互关系。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png\" alt=\"image-20231109134527874\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cp>不过，该架构依赖于 LXC，存在以下问题：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>依赖于外部工具，对 Docker 来说，存在着巨大的生存风险\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>LXC 使得 Docker 无法实现跨平台（只能在 Linux 平台上使用）\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Docker Daemon 的“大而全”也带来了严重的问题：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>版本更新与功能扩展较难\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>运行较慢，带来性能问题\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Docker Daemon 运行出现问题，会直接影响容器的运行，不符合软件哲学\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"h2-1-docker-09-\">Docker 0.9 版本\u003C\u002Fh2>\n\u003Cp>Docker 公司开发了名为 Libcontainer 的自研工具，用于替代 LXC。Libcontainer 的目标是成为与平台无关的工具，可基于不同内核为 Docker 上层提供必要的容器交互功能。在 Docker 0.9 版本中，Libcontainer 取代 LXC 成为默认的执行驱动。\u003C\u002Fp>\n\u003Ch2 id=\"h2-2-docker-111-\">Docker 1.11 版本\u003C\u002Fh2>\n\u003Cp>2017 年 7 月 OCI 基金会发布了两个规范（镜像规范与容器运行时规范）的 OCI1.0 版本。2016 年底发布的 Docker1.11 版本基本遵循了 OCI1.0 版本。\u003C\u002Fp>\n\u003Cp>从 Docker1.11 版本开始，Docker Daemon 中不再包含任何容器运行时代码，而是将容器运行时单独剥离了出来，形成了 Runc 项目。\u003C\u002Fp>\n\u003Cp>目前 Docker 引擎的架构示意图如下图所示，图中有简要的描述。\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309051420909.png\" alt=\"image-image-20230905142009677\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309051420909.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309051420909.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309051420909.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309051420909.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>Docker Client\u003C\u002Fcode>：Docker 客户端，Docker 引擎提供的 CLI 工具，用于用户向 Docker 提交命令请求。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>Dockerd\u003C\u002Fcode>：即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>runc \u003C\u002Fcode>：只有一个作用——创建容器。不过它是一个 CLI 包装器，实质上就是一个独立的容器运行时工具。因此直接下载它或基于源码编译二进制文件，即可拥有一个全功能的 runc。有时也将 runc 所在的那一层称为“OCI 层”。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>containerd\u003C\u002Fcode>：在对 Docker daemon 的功能进行拆解后，所有的容器执行逻辑被重构到一个新的名为 containerd 的工具中。它的主要任务是容器的生命周期管理——start | stop | pause | rm······\u003C\u002Fp>\n\u003Cp>Docker 引擎技术栈中，containerd 位于 daemon 和 runc 所在的 OCI 层之间。containerd 在 Linux 和 Windows 中以 daemon 的方式运行，从 1.11 版本之后 Docker 就开始在 Linux 上使用它。如前所述，containerd 最初被设计为轻量级的小型工具，仅用于容器的生命周期管理。然而，随着时间的推移，它被赋予了更多的功能，比如镜像管理。containerd 是由 Docker 公司开发的，并捐献给了云原生计算基金会（Cloud Native Computing Foundation, CNCF）。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>shim\u003C\u002Fcode>：实现无 daemon 的容器（用于将运行中的容器与 daemon 解耦，以便进行 daemon 升级等操作）不可或缺的工具。前面提到，containerd 指挥 runc 来创建新容器。事实上，每次创建容器时它都会 fork 一个新的 runc 实例。不过，一旦容器创建完毕，对应的 runc 进程就会退出。因此，即使运行上百个容器，也无须保持上百个运行中的 runc 实例。\u003C\u002Fp>\n\u003Cp>\u003Ccode>一旦容器进程的父进程 runc 退出，相关联的 containerd-shim 进程就会成为容器的父进程\u003C\u002Fcode>。作为容器的父进程，shim 的部分职责如下。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>保持所有 STDIN 和 STDOUT 流是开启状态，从而当 daemon 重启的时候，容器不会因为管道（pipe）的关闭而终止。\u003C\u002Fli>\n\u003Cli>将容器的退出状态反馈给 daemon。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n","现代 Docker 引擎由如下主要的组件构成：Docker 客户端（Docker Client）、Docker 守护进程（Docker daemon）、containerd 以及 runc。它们共同负责容器的创建和运行。下面是 Docker 引擎的发展过程： 首发版本 Docker 首次发布时，Docker 引擎由两个","https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202311091345974.png"]