zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker 架构演进

Docker架构 演进
2023-09-14 09:01:46 时间

网络上关于K8S-1.20宣布弃用docker,炒的沸沸扬扬,但多数文章讲的不够详细。虽然也有一些文章讲的还不错,但都不够完整,不够具体。例如∶

1.k8s要废除的是 docker 还是 dockershim?

2.为什么要弃用,什么时候弃用?替代品是谁? 2.dockershim是什么? dockershim和 docker 是什么关系,和CRT 又是什么关系?

3.dockershim和containerd-shim都有 shim,是一回事吗?

4.容器运行时是CRI 还是 OCI ?

5. 使用docker和弃用docker后的架构分别是什么样的呢?

6. 弃用docker只是简单的删除 docker二进制 就行了吗?

7. 弃用docker后如何制作并上传镜像呢?

8.原来docker创建的容器、下载的镜像,containerd能继续沿用吗?

9.containerd的 镜像mirror 、证书 如何配置?

10.没有了docker,如何查看容器、查看镜像呢?

11.能用podman替代docker用于k8s环境吗?

 

 

容器技术简史


2002年,在Linux2.4.19内核中出现了第一个namespace(mount),其他namespace于2006年开始逐渐加入。直到 3.8内核才算有了足够多的namespace,以支持容器技术。截至5.6内核,已有8种namespace∶mnt、pid、net、 pic、uts 、user 、cgroup 、time。

2008年,在2.6.24内核中首次集成了 control cgroup(简称cgroup)。

再加上chroot等众多技术,就形成了容器,并一直进化完善、生态快速发展。就是说,容器并不是一种真实存在于 Linux内核中的技术,而是namespace、cgroup、chroot等等许多技术的合集。

早期有LXC、Docker实现了容器,后来随着技术发展与博弈,尤其是kubemetes及其容器运行时生态的发展壮大,容器技术的实现及上层封装越发复杂。导致概念、术语众多,盘根错节,千头万绪难以琢磨。这也正是本文之目的,将错综复杂的各种术语——弄清,尤其是他们之间的关联。

 

阐述是基于以下版本

1.系统∶ centos7.9x86_64(3.10.0-1160)

2.kubernetes∶1.20.2(kubeadm部署)

3.docker: ce 20.10.2

4.containerd: 1.4.3

5.runc: 1.0.0-rc92

6.kata: 1.11.5

7.crict: 0.1.0

 

Docker架构演进


由于当代容器运行时架构是由Docker逐渐演化而成,因此了解Docker架构的演进显得十分必要。最初,docker仅有1个二进制,就叫docker,既是cli又是server(daemon)。容器启动的应用程序,直接挂在docker daemon下(就这么简单)

后来,功能拆分∶ daemon独立出来,形成了 dockerd和containerd;创建namespace与cgroup的逻辑独立出来,形成了 runc;调用runc、监视容器(stdin、状态等)形成了 containerd-shim。

docker最早期二进制文件只有一个就是docker很轻量,启动容器,容器进程在docker进程下面可以看到,如pstree

以前docker进程挂载在docker进程下面,现在是挂载在containerd-shim下面,containerd-shim作为一个父进程,其起到了父进程和监控容器的作用

Docker-runc主要是创建常用的docker 5个namespace,调用完之后就退出了。runc除了创建namspce cgroup还会去启动容器的程序,启动之后将容器进程挂载在docker-containerd-shim的子进程

 在19版本叫做containerd-shim  当20版本containerd-shim-runc-v2

 

[root@reg ~]# ps -ef | grep dockerd | grep -v grep
root       1106      1  0 13:33 ?        00:01:38 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=reg.harbor.com


[root@reg ~]# ps -ef | grep containerd | grep -v grep
root       1104      1  0 13:33 ?        00:00:40 /usr/bin/containerd
root       1106      1  0 13:33 ?        00:01:38 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=reg.harbor.com
root      53639   1104  0 15:43 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/2947c729d51d317189bbba725029e827c69219b99cdd4404e4425506d43b35f3 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root      55492   1104  0 16:55 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/20e45e597a9444965e06c1d0dc48c892e7ca2d0a802c7fd2a2beaa813a1eb931 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc


[root@reg ~]# ps -ef | grep containerd-shim | grep -v grep
root      53639   1104  0 15:43 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/2947c729d51d317189bbba725029e827c69219b99cdd4404e4425506d43b35f3 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
root      55492   1104  0 16:55 ?        00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/20e45e597a9444965e06c1d0dc48c892e7ca2d0a802c7fd2a2beaa813a1eb931 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

上面19 20都是containerd和dokerd独立出来了,20版本container-shim-runc2-v2直接作为systemd的子进程,不是挂载在containerd下面 

 

各架构主要二进制

早期∶ docker

中期∶ docker、dockerd、docker-containerd、docker-containerd-shim、docker-runc、docker-containerd-ctr

当前∶docker、dockerd、containerd、containerd-shim、containerd-shim-runcv1/2、runc、ctr、crictl

因此,当前Docker容器运行起来由几个二进制组件组成

1. docker : cli

2.dockerd∶也叫做docker daemon或docker engine,对外提供API接口(var/run/docker.sock),封装了容器操作(创建启动停止等),以及镜像操作(制作/上传/下载)。不支持CRI

3.containerd∶对外提供API接口(var/run/containerd/containerd.sock),同时提供原生非CRI接口、CRI接口,dockerd调用containerd是走非CRI接口(通过yum instal docker-ce依赖安装的containerd是关闭CRI接口)

4.containerd-shim∶由containerd调用,有2个作用,调用runc创建容器,以及接管、监视容器应用进程,如 stdin、状态等。ce19默认用containerd-shim,ce20默认用containerd-shim-runc-v2

5.runc∶为容器创建OCl标准的环境,如namespace、cgroup等,但不包括镜像

早期的docker是守护进程+cli,现在docker就是cli命令行工具,Dockerd不支持CRI,非常重要!!!!!!!!!!!!

 

镜像下载   平时敲的docker pull到底是由dockerd下载的还是containerd下载的?

containerd 不仅负责容器生命周期的管理,同时还负责一些其他的功能:镜像的管理,例如容器运行前从镜像仓库拉取镜像到本地