• 【云原生 二】 Docker架构演进过程


    从1.4版本开始接触docker,到现在的20.10.*版本,可以说docker已经女大十八变。很早就想总结一下docker架构的几次大的变化,虽然留意并感觉到了docker架构的变化,苦于“难见以前的她”,以及具体在哪个版本开始变化的,所以一直没有搞。总有些志同道合的人已经做了这件事,翻看了一下他们的总结+实际实验,所以我也来说道说道。

    这里我划分了四个时期:docker早期架构、docker中期架构、docker晚期架构、docker现有架构。

    docker早期架构

    早期docker(docker1.6.2)只有一个叫docker的二进制可执行程序,客户端、服务端一肩挑,通过docker加载Image创建container,并执行容器中的CMD以启用容器。此时容器中看到的1号进程就是外面的docker。

    1. 调用链:docker -> container's CMD
    2. 与容器进程关系:
    3. systemd
    4. |_ _ docker
    5. |_ _ container1 processor
    6. |_ _ container2 processor

    docker中期架构

    到了中期(docker17.*)docker前后端拆分,客户端docker被拆了出来,同时server端也进行了拆解(详见下面的调用链)。此时容器中看到的1号进程就是外面的docker-containerd-shim。

    1. 调用链:dockerd -> docker-containerd -> docker-containerd-shim -> docker-runc(执行完就退出) -> container's CMD
    2. 与容器进程关系:
    3. systemd
    4. |_ _ dockerd
    5. |_ _ docker-containerd
    6. |_ _ docker-containerd-shim
    7. | |_ _container1 processor
    8. |_ _ docker-containerd-shim
    9. |_ _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的架构变动。

    1. 调用链:dockerd -> containerd -> containerd-shim -> runc(执行完就退出) -> container's CMD
    2. 与容器进程关系:
    3. systemd
    4. |_ _ dockerd
    5. |_ _ containerd
    6. |_ _ containerd-shim
    7. | |_ _ container1 processor
    8. |_ _ containerd-shim
    9. |_ _ container2 processor
    10. # containerd.io包内容:
    11. rpm -ql containerd.io
    12. /etc/containerd
    13. /etc/containerd/config.toml
    14. /usr/bin/containerd
    15. /usr/bin/containerd-shim
    16. /usr/bin/ctr
    17. /usr/lib/systemd/system/containerd.service
    18. /usr/sbin/runc

    docker现在架构

    docker现在(docker20.10.*)的架构跟上面没有区别了,区别在于containerd的变化。containerd-shim换成了containerd-shim-runc-v2,调用逻辑也有所不同,containerd同dockerd一样彻底独立出来了,其下不再有子进程。此时容器中看到的1号进程就是外面的containerd-shim-runc-v2。

    1. 调用链:dockerd -> containerd -> containerd-shim(执行完就退出) -> containerd-shim-runc-v2 -> runc(执行完就退出) -> container's CMD
    2. 与容器进程关系:
    3. systemd
    4. |_ _ dockerd
    5. |
    6. |_ _ containerd
    7. |
    8. |_ _ containerd-shim-runc-v2
    9. | |_ _ container1 processor
    10. |
    11. |_ _ containerd-shim-runc-v2
    12. |_ _container2 processor
    13. # containerd.io包内容:
    14. rpm -ql containerd.io
    15. /etc/containerd
    16. /etc/containerd/config.toml
    17. /usr/bin/containerd
    18. /usr/bin/containerd-shim
    19. /usr/bin/containerd-shim-runc-v1
    20. /usr/bin/containerd-shim-runc-v2
    21. /usr/bin/ctr
    22. /usr/bin/runc
    23. /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的演进过程”怎么样?

  • 相关阅读:
    [Machine Learning] Learning with Noisy Data
    Python的电机控制模拟程序
    234. 回文链表 --力扣 --JAVA
    计算机毕业设计【HTML+CSS+JavaScript服装购物商城】毕业论文源码
    Unknown module(s) in QT : datavisualization解决
    在Mac 中 pip 不存在,Python版本和pycharm对不上
    国庆假期day5
    Axure 学习:简单的下拉菜单为什么做不好?
    Undo Log、Redo Log、binlog与两阶段提交
    激光雷达:自动驾驶的眼睛
  • 原文地址:https://blog.csdn.net/avatar_2009/article/details/126050482