Kubernetes 对 Docker 的使用方式改变
首先,要明确的是,Kubernetes 并没有完全放弃 Docker,而是改变了对 Docker 的使用方式。
这一改变主要是因为 Kubernetes 1.20 版本宣布弃用 Docker 容器运行时的支持,Kubernetes 1.24 (2022.05)版本正式弃用Dockershim。
这意味着,虽然在 Kubernetes 集群中可以运行用 Docker 构建的容器镜像,但 Kubernetes 将不再使用 Docker 作为容器运行时。
这个改变背后的原因是 Docker 和 Kubernetes 之间的技术差异。
Docker 是一个包含多种功能的大型应用,除了容器运行时之外,还包括图像管理、存储、网络等。而 Kubernetes 实际上只需要容器运行时这一部分功能。
因此,为了减轻 Kubernetes 的负担,更高效地管理容器,Kubernetes 开始支持更加轻量级和标准化的容器运行时接口(CRI)。
Kuberetes 并没有淘汰 Docker
这并不意味着 Docker 被淘汰,因为 Docker 构建的容器镜像仍然可以在 Kubernetes 中运行。
只是 Kubernetes 会使用其他容器运行时(如 containerd 或 CRI-O)来直接运行这些镜像。
Docker 镜像本身符合 OCI(Open Container Initiative)标准,因此可以被任何标准的容器运行时使用。
CRI-Docker
cri-docker 是 Container Runtime Interface (CRI) 的一个实现,专为 Docker 设计。CRI 是由 Kubernetes 引入的标准接口,用于与容器运行时进行通信。最初,Kubernetes 直接支持 Docker 作为默认的容器运行时,但随着 Kubernetes 的发展,为了支持更多的容器运行时(如 containerd、CRI-O 等),引入了 CRI。
Containerd
在 Kubernetes 1.24版本之后,containerd 作为默认容器运行时,负责管理各个节点上的容器。
Docker和Containerd 功能对比
镜像相关功能 |
Docker |
Containerd |
显示本地镜像列表 |
docker images |
ctr -n k8s.io images ls |
下载镜像 |
docker pull |
ctr -n k8s.io images pull -h |
上传镜像 |
docker push |
ctr -n k8s.io images push -h |
*删除本地镜像 |
docker rmi |
ctr -n k8s.io delete |
查看镜像详情 |
docker inspect IMAGE-ID |
crictl inspecti IMAGE-ID |
*导出离线镜像 |
docker save xxx > xxx.tar |
ctr -n k8s.io images export nginx-1.21.6.tar docker.io/library/nginx:1.21.6 |
*导入离线镜像 |
docker load -i xxx.tar |
ctr -n k8s.io images import xxx.tar |
容器相关功能 |
Docker |
Containerd |
显示容器列表 |
docker ps |
crictl ps |
创建容器 |
docker create |
crictl create |
启动容器 |
docker start |
crictl start |
停止容器 |
docker stop |
crictl stop |
删除容器 |
docker rm |
crictl rm |
查看容器详情 |
docker inspect |
crictl inspect |
attach |
docker attach |
crictl attach |
exec |
docker exec |
crictl exec |
logs |
docker logs |
crictl logs |
stats |
docker stats |
crictl stats |
POD 相关功能 |
Docker |
Containerd |
显示 POD 列表 |
无 |
crictl pods |
查看 POD 详情 |
无 |
crictl inspectp |
运行 POD |
无 |
crictl runp |
停止 POD |
无 |
crictl stopp |