网络上关于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 不仅负责容器生命周期的管理,同时还负责一些其他的功能:镜像的管理,例如容器运行前从镜像仓库拉取镜像到本地