docker 架构

进程树:

1
2
3
4
/usr/bin/dockerd
└─docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock...
└─docker-containerd-shim f195bb34b2a34e53f8d6...
└─nginx: master process nginx -g daemon off;

dockerd

containerd是容器技术标准化之后的产物,为了能够兼容OCI标准,将容器运行时及其管理功能从Docker Daemon剥离。理论上,即使不运行dockerd,也能够直接通过containerd来管理容器。(当然,containerd本身也只是一个守护进程,容器的实际运行时由后面介绍的runC控制。)

1
/usr/bin/dockerd

docker-containerd

containerd主要职责是镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)。

containerd向上为Docker Daemon提供了gRPC接口,使得Docker Daemon屏蔽下面的结构变化,确保原有接口向下兼容。向下通过containerd-shim结合runC,使得引擎可以独立升级,避免之前Docker Daemon升级会导致所有容器不可用的问题。

containerd独立负责容器运行时和生命周期(如创建、启动、停止、中止、信号处理、删除等)

1
docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

docker-containerd-shim

容器的代理,接受容器创建、删除等命令,管理容器进程。

1
docker-containerd-shim f195bb34b2a34e53f8d6b38af405185e9ce3cf59c38a12545c1f1416bd7a162c /var/run/docker/libcontainerd/f195bb34b2a34e53f8d6b38af405185e9ce3cf59c38a12545c1f1416bd7a162c docker-runc

runc

OCI定义了容器运行时标准,runC是Docker按照开放容器格式标准(OCF, Open Container Format)制定的一种具体实现。

runC是从Docker的libcontainer中迁移而来的,实现了容器启停、资源隔离等功能。Docker默认提供了docker-runc实现,事实上,通过containerd的封装,可以在Docker Daemon启动的时候指定runc的实现。

containerd-shim通过run操作容器。创建完成后runc退出,容器进程由containerd-shim接管。容器内产生的孤儿进程也统一由containerd-shim接管。

使用runc运行容器

1
2
3
4
5
6
7
8
$ mkdir -p mycontainer/rootfs && cd mycontainer
# 生成rootfs
$ docker export $(docker create nginx:1.10.1-alpine) | tar -C rootfs/ -xf -
# 生成配置文件config.json
$ docker-runc spec
# 运行容器
$ docker-runc run test
/ # /* 进入容器 */
显示 Gitment 评论