Docker 引擎
上篇文章做了一个总结,今天这篇文章来说一下Docker 引擎
从0到1入门Docker(四)总结 - 掘金 (juejin.cn)
学习Docker推荐大家可以看动力哥的视频,课程适合零基础、技术提升乃至所有编程语言开发者;课程对应包含含基础篇、提升篇与高级篇,共计十二大章节。
课程主要学习知识点:“7个深度/3个全面”;针对Docker的知识体系,无需再查找任何其它资料。
课程中的源码、资料、工具、文档、作业分享给大家
Docker 引擎发展历程
1. 首发版本架构
Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker
Daemon。
不过,该架构依赖于 LXC,使得 Docker 存在严重的问题:
-
依赖于外部工具,对 Docker 来说,存在着巨大的生存风险
-
LXC 使得 Docker 无法实现跨平台
Docker Daemon 的“大而全”也带来了严重的问题:
-
版本更新与功能扩展较难
-
运行较慢,带来性能问题
-
Docker Daemon 运行出现问题,会直接影响容器的运行
-
不符合软件哲学
2. Docker0.9 版本架构
从 Docker0.8 版本开始,Docker 使用自研的 Libcontainer 工具替换了 LXC。
3. Docker1.1 版本架构
2017 年 7 月 OCI 基金会发布了两个规范(镜像规范与容器运行时规范)的 OCI1.0 版本。
2016 年底发布的 Docker1.1 版本基本遵循了 OCI1.0 版本。
从 Docker1.1 版本开始,Docker Daemon 中不再包含任何容器运行时代码,而是将容器
运行时单独剥离了出来,形成了 Runc 项目。
4. Docker 引擎架构
Docker 引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:
Docker Client,Dockerd、Containerd 与 Runc。
4.1 Docker Client
Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。
4.2 Dockerd
Dockerd,即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管
理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信。
4.3 Containerd
Containerd,即 Container Daemon,该项目的主要功能是管理容器的生命周期。不过,
其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。
Docker 公司后来将 Containerd 项目捐献给了 CNCF(云原生基金会)。
4.4 Runc
Runc,Run Container,是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项
目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker
Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。
Runc 只有一个作用—创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork
出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。
5. Shim
Shim(垫片)是实现“Daemonless Container(无 Docker Daemon 与 Container Daemon
容器)”不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。
每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。当 Runc 自动退出
之前,会先将新容器进程的父进程指定为相应的 Shim 进程。
除了作为容器的父进程外,Shim 进程还具有两个重要功能:
(1)保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。
(2)将容器的退出状态反馈给 Docker Daemon。