从1.4版本开始接触docker,到现在的20.10.*版本,可以说docker已经女大十八变。很早就想总结一下docker架构的几次大的变化,虽然留意并感觉到了docker架构的变化,苦于“难见以前的她”,以及具体在哪个版本开始变化的,所以一直没有搞。总有些志同道合的人已经做了这件事,翻看了一下他们的总结+实际实验,所以我也来说道说道。
这里我划分了四个时期:docker早期架构、docker中期架构、docker晚期架构、docker现有架构。
docker早期架构
早期docker(docker1.6.2)只有一个叫docker的二进制可执行程序,客户端、服务端一肩挑,通过docker加载Image创建container,并执行容器中的CMD以启用容器。此时容器中看到的1号进程就是外面的docker。
调用链:docker -> container's CMD
与容器进程关系:
systemd
|_ _ docker
|_ _ container1 processor
|_ _ container2 processor
docker中期架构
到了中期(docker17.*)docker前后端拆分,客户端docker被拆了出来,同时server端也进行了拆解(详见下面的调用链)。此时容器中看到的1号进程就是外面的docker-containerd-shim。
调用链:dockerd -> docker-containerd -> docker-containerd-shim -> docker-runc(执行完就退出) -> container's CMD
与容器进程关系:
systemd
|_ _ dockerd
|_ _ docker-containerd
|_ _ docker-containerd-shim
| |_ _container1 processor
|_ _ docker-containerd-shim
|_ _container2 processor
举例:
4459 1 4 Jul05 ? 23:54:49 /usr/bin/dockerd --bip=197.166.100.1/24 --ip-masq=false --mtu=1450 --insecure-registry 192.168.14.251:5000
5369 4459 0 Jul05 ? 01:07:38 docker-containerd --config /var/run/docker/containerd/containerd.toml
7779 5369 0 08:19 ? 00:00:01 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/d744886fd646f1bd918aa83a44b166f32a09ab49c4b1065d7f6c34b07c71448f -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
7800 7779 1 08:19 ? 00:08:25 java -Xmx1g -jar -Dlog4j2.formatMsgNoLookups=true /opt/smc-server-3.0.jar
docker后期架构
docker后期(docker19.*+),docker为了推出容器标准,将容器相关的功能拆到了containerd中,并将其捐献给了云原生计算基金会。至此,你可以跳过docker,直接使用containerd进行容器管理(镜像、容器相关的所有操作都OK)。此时容器中看到的1号进程就是外面的containerd-shim。
此后,docker架构的所有变化都是围绕containerd来的,docker本身已经没有架构上的变化。也就是说现在的架构和后期架构比,只有containerd的架构变动。
调用链:dockerd -> containerd -> containerd-shim -> runc(执行完就退出) -> container's CMD
与容器进程关系:
systemd
|_ _ dockerd
|_ _ containerd
|_ _ containerd-shim
| |_ _ container1 processor
|_ _ containerd-shim
|_ _ container2 processor
# containerd.io包内容:
rpm -ql containerd.io
/etc/containerd
/etc/containerd/config.toml
/usr/bin/containerd
/usr/bin/containerd-shim
/usr/bin/ctr
/usr/lib/systemd/system/containerd.service
/usr/sbin/runc
docker现在架构
docker现在(docker20.10.*)的架构跟上面没有区别了,区别在于containerd的变化。containerd-shim换成了containerd-shim-runc-v2,调用逻辑也有所不同,containerd同dockerd一样彻底独立出来了,其下不再有子进程。此时容器中看到的1号进程就是外面的containerd-shim-runc-v2。
调用链:dockerd -> containerd -> containerd-shim(执行完就退出) -> containerd-shim-runc-v2 -> runc(执行完就退出) -> container's CMD
与容器进程关系:
systemd
|_ _ dockerd
|
|_ _ containerd
|
|_ _ containerd-shim-runc-v2
| |_ _ container1 processor
|
|_ _ containerd-shim-runc-v2
|_ _container2 processor
# containerd.io包内容:
rpm -ql containerd.io
/etc/containerd
/etc/containerd/config.toml
/usr/bin/containerd
/usr/bin/containerd-shim
/usr/bin/containerd-shim-runc-v1
/usr/bin/containerd-shim-runc-v2
/usr/bin/ctr
/usr/bin/runc
/usr/lib/systemd/system/containerd.service
举例:
ps -ef |grep container
3933 1 0 Jul25 ? 00:32:28 /usr/bin/containerd
3948 1 0 Jul25 ? 00:00:46 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
4092 1 0 Jul25 ? 00:02:39 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 79e0c69bb231f9d42d198ee4afbc9bb9c98be0156e04db1f20dcefb87614f7c6 -address /run/containerd/containerd.sock
15294 4092 0 Jul25 ? 00:16:23 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true
前面我们了解了一下“CRI、OCI、containerd和CRI-O、runc”等概念,今次又说道了一下“Docker架构演进过程”,下次我们讲点啥好呢?“kubelet调用CRI的演进过程”怎么样?