
在看系统进程的时候,发现了这样的进程关系:
systemd 里调用了
- containerd -> containerd-shim
- dockerd -> docker-proxy
引起了我的兴趣。
ps: 另外上边只是在 docker 19.03 上发现了这样的调用关系,在 docker 17.06 上调用的关系实际上是这样:
-dockerd --registry-mirror=http:/xxx
| -docker-containe -l unix:///xxx
| -docker-containe
| -docker-proxy -proto xxx
在 19.03 版本中,docker相关的可执行文件如下:

其中以docker开头的,docker, dockerd, docker-init, docker-proxy 是 docker 公司专属的,并非标准。
因为 docker 一直在开发中,网上很多资料都比较陈旧,不过八九不离十,无非是几个组件变了个名字:
- docker,是一个客户端工具,用来把用户的请求发送给 docker daemon(dockerd)。
- dockerd, docker daemon,一般也会被称为 docker engine。dockerd 启动时会启动 containerd 子进程。
- Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性,几乎囊括了单机运行一个容器运行时所需要的一切:执行,分发,监控,网络,构建,日志等。主要作用是:
- 管理容器的生命周期(从创建容器到销毁容器)
- 拉取/推送容器镜像
- 存储管理(管理镜像及容器数据的存储)
- 调用 runC 运行容器(与 runC 等容器运行时交互)
- 管理容器网络接口及网络
- ctr 是 containerd 的 cli。
- 为了能够支持多种 OCI Runtime,containerd 内部使用
containerd-shim
,每启动一个容器都会创建一个新的 containerd-shim
进程,指定容器 ID,Bundle 目录,运行时的二进制(比如 runc)。
- RunC 是一个轻量级的工具,用来运行容器的,我们可以不用通过 docker 引擎,直接运行容器。事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。
调用链主要就是下面这张图:
