《Docker Deep Dive》Note - Docker 引擎

时间:2022-04-14 10:25:11

《Docker Deep Dive》Note

Docker 引擎

1. 概览

graph TB
A(Docker client) --- B(daemon)
subgraph Docker 引擎
B --- C(containerd)
C --- D(runc)
end

Docker 引擎是用来运行和管理容器的核心软件。
主要构成:Docker Client、Docker daemon(Docker守护进程)、containerd、runc。

2. 详解

graph TB
A(Docker client) --- B(Docker daemon)
B --- C(containerd)
subgraph 容器Supervisor
C --- D(shim)
D --- D1(runc)
D1 --- D2[运行容器]
C --- E(shim)
E --- E1(runc)
E1 --- E2[运行容器]
C --- F(shim)
F --- F1(runc)
F1 --- F2[运行容器]
C --- G(shim)
G --- G1(runc)
G1 --- G2[运行容器]
end

3. 开放容器计划(OCI)

基于 OCI 的标准,Docker 引擎采用模块化设计。
开放容器计划定义了两个容器相关的规范:

  • 镜像规范
  • 容器运行时规范

Docker 引擎尽可能实现了OCI的规范,Docker daemon 不再包含任何容器运行时的代码,所有的容器运行时代码在一个单独的OCI兼容层中实现。

4. runc

runc 是 OCI 容器运行时规范的参考实现(容器运行时)。
runc 只有一个作用--创建容器。
基于 Libcontainer。

5. containerd

containerd 的作用是容器的生命周期管理。
containerd 在 Linux 和 Windows 中以 Daemin 的方式运行。
containerd 也包含诸如镜像管理的模块化功能。

6. 启动容器

graph TB
A(Docker client) --向 Docker API 发出 docker container run 命令--> B(Docker daemon)
B --在 API 端点接收指令 指示 containerd 启动新容器--> C(containerd)
C --给 runc 传递 OCI bundle即镜像 指示 runc 创建容器--> D(shim)
subgraph runc
D --> E(runc)
E --> F(运行容器)
end

7. 解耦模型的优势

daemonless container

  • Docker daemon 的维护和升级工作不会影响到运行中的容器。

8. shim 组件

  • 保持所有 STDIN 和 STDOUT 流是开启状态,从而当 daemon 重启的时候容器不会因为管道(pipe)的关闭而终止。
  • 将容器的退出状态反馈给 daemon。

9. daemon

目前仍然有很多功能是在 Docker daemon 中实现的。
其中多数功能可能会随着时间推移被拆解。
目前 daemon 中存在但不仅限的功能包括:API、镜像管理、身份认证、安全特性、核心网络以及卷。

由此可以得出结论:Docker 引擎的模块化工作仍在进行中

The end
Last updated by Jehorn