》和《》中分别介绍了 runC 和 containerd。本文我们将结合 docker 中的其它组件探索 docker 是如何把这些组件组织起来协调工作的。
用户的请求发送给 docker daemon(dockerd)。该程序的安装路径为:
/usr/bin/
/usr/bin/
》。该程序的安装路径为:
/usr/bin/
/usr/bin/
》。该程序的安装路径为:
/usr/bin/
$ docker run hello-world
输出信息指出,hello-world 容器的运行经历了如下四步:
- 输出
- 输出的内容发送给了 docker 客户端
(REST)的方式对外提供服务,Engine API 里描述了 dockerd 支持的所有请求。Docker 客户端与 dockerd 之间就是通过 REST 的方式通信的。在 ubuntu 16.04 中,dockerd 默认是不监听 tcp 端口的,为了方便演示,我们让 dockerd 监听 tcp 端口。这样就可以使用 curl 代替 docker 客户端向 dockerd 发送请求了。具体的操作为,先
#
$ systemctl daemon- systemctl restart docker.service
$ curl -X POST
来完成了。Dockerd 与 docker-containerd 之间是通过 grpc 协议通信的。当 docker-containerd 收到 dockerd 启动容器的请求之后,会做一些初始化工作,然后启动 进程,并将相关配置作为参数传给它。docker-containerd 负责管理所有本机正在运行的容器,而一个 docker-containerd-shim 进程只负责管理一个运行的容器,它相当于 的一个封装,充当 docker-containerd 和 docker-runc 之间的桥梁,docker-runc 能干的就交给 docker-runc 来做,docker-runc 做不了的就放到这里来做。下面我们用 ubuntu 镜像运行一个容器:
$ docker run - ubuntu bash
------------
可以看到对 containerd-shim 的一些解释。