本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
Linux 专栏 | Docker 专栏 | Kubernetes 专栏
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
[二、Docker 简介](#二、Docker 简介)
[三、Containerd 简介](#三、Containerd 简介)
[1、Kubernetes 场景下的选择](#1、Kubernetes 场景下的选择)
[附录一:Containerd 安装方法(二进制方式)](#附录一:Containerd 安装方法(二进制方式))
[附录二:Containerd 常用命令](#附录二:Containerd 常用命令)
[1、ctr 命令](#1、ctr 命令)
[2、crictl 命令](#2、crictl 命令)
一、基本概念
在 Kubernetes 中,容器运行时(Container Runtime)是集群 Node 节点的核心组件之一。
Container Runtime 的主要功能包括:
- 镜像管理
- 容器生命周期管理,包括容器的创建、启动、停止、删除
- 资源隔离
- 网络配置
- 存储挂载
- 安全特性
Kubernetes 集群的 Kubelet 组件,可以通过 Container Runtime Interface(CRI)与 Container Runtime 进行交互,确保容器能够按照 Kubernetes 的调度策略和管理要求,在 Node 节点上运行。
主流的容器运行时有 Docker、Containerd 等。Docker 是早期最流行的容器运行时,而 Containerd 最早是 Docker 的组件之一。本文将对 Docker 与 Containerd 的关系、选择等内容进行详细解读。
二、Docker 简介
笔者在 Docker 专栏 文章【Docker】专题一:Docker 基本架构 做过介绍,点击查看更多详细内容。
Docker 是一种轻量级虚拟化技术,用户通过 Docker 可以在多个隔离的环境中运行不同的应用程序,从而简化了应用程序的打包、分发和部署过程。
Docker 最开始只是一个单一的二进制文件,负责镜像、容器、网络、卷等资源所有的管理工作。
在 Docker 后续演化的架构中,Containerd 成为 Docker Daemon 的核心子组件,承担与容器相关的实际管理工作:
- Docker Daemon 将高层指令(如 docker run)转换为 Containerd 可以理解的指令
- Containerd 则使用 Runc 作为容器运行时(Container Runtime),通过调用 Runc 实际执行这些指令
三、Containerd 简介
Containerd 是一种行业标准的容器运行时,强调简单性、健壮性和可移植性。
Containerd 最初是 Docker 的组件之一,负责管理容器的生命周期,其设计目标是提供一个简单、高效、安全的容器运行时,专注于核心功能,避免不必要的复杂性。
2017 年,Docker 将 Containerd 作为一个独立的容器运行时项目,捐赠给了云原生计算基金会(CNCF),目前已经成为容器管理领域的标准。
四、容器运行时的选择
1、Kubernetes 场景下的选择
Kubernetes 从 1.20 版本开始,推荐使用 Containerd 作为默认的容器运行时,弃用了对 Docker 的直接支持(⚠️ 不是完全不支持!)。
Kubernetes 对默认容器运行时的变更,是基于 Containerd 与 Docker 相比具有调用链更短、组件更少、占用节点资源更少、运行更稳定的优势,可以为 Kubernetes 提供更轻量、更高效的容器管理能力,以及对 OCI 标准的全面支持能力。
如下图所示,Containerd 与 Kubernetes 可以实现更紧密、高效的集成:
- Kubernetes 弃用对 Docker 的直接支持之前,Kubelet 使用 Containerd 作为高层运行时,中间需要经过 Dockershim 和 Dockerd 两步转发
- Kubernetes 弃用对 Docker 的直接支持之后,Kubelet 直接访问 Containerd,提升了容器运行时的调用效率(🔔 CRI-Plugin 运行在 Containerd 进程中,实现类似 Dockershim 的功能)
2、其他场景下的选择
当遇到以下使用场景时,仍需要选择 Docker 作为容器运行时:
- 使用 DinD(Docker in Docker)
- 使用 docker build、docker push、docker save、docker load 等命令
- 调用 docker API
- 使用 Docker Compose、Docker Machine、Docker Swarm
- 使用 Sealer 部署 Kubernetes 集群,默认使用 Docker 作为容器运行时
附录一:Containerd 安装方法(二进制方式)
bash
# AMD架构
wget https://github.com/containerd/containerd/releases/download/v1.7.21/containerd-1.7.21-linux-amd64.tar.gz
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
systemctl daemon-reload
systemctl enable --now containerd
===================================================================================
# ARM架构
wget https://github.com/containerd/containerd/releases/download/v1.7.21/containerd-1.7.21-linux-arm64.tar.gz
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
systemctl daemon-reload
systemctl enable --now containerd
附录二:Containerd 常用命令
笔者在 Docker 专栏 文章【Docker】专题二:Docker 常用命令 中已经介绍过常用的 Docker 命令,点击查看更多详细内容。
在 Containerd 作为容器运行时的情况下,可以通过 ctr 工具或 crictl 工具来与之进行交互:
- ctr 是 Containerd 自带的客户端工具
- crictl 是 CRI 客户端工具,比较接近 docker 命令
此外还有 nerdctl 等类似工具,以后找机会给大家详细介绍。
1、ctr 命令
bash
# 镜像操作命令
ctr -n <ns> i xx # 镜像操作命令格式,默认 ns 为 k8s.io
ctr i ls # 查看本地镜像列表,同 docker images
ctr i rm <镜像ID或镜像名> # 删除本地镜像,同 docker rmi -f <镜像ID或镜像名>
ctr i pull <镜像名> # 拉取远程镜像,同 docker pull <镜像名>
ctr i tag <旧镜像名> <新镜像名> # 修改镜像名称,同 docker tag <旧镜像名> <新镜像名>
ctr i import xxx.tar # 从本地文件导入镜像,同 docker load -i xxx.tar
ctr i export xxx.tar <镜像名> # 导出镜像为本地文件,同 docker save <镜像名> -o xxx.tar
# 容器操作命令
ctr -n <ns> c xx # 容器操作命令格式,默认 ns 为 k8s.io
ctr c ls # 查看容器列表,同 docker ps -a,查看所有容器
ctr c rm <容器ID或容器名> # 删除容器,同 docker rm -f <容器ID或容器名>
ctr c info <容器ID或容器名> # 查看容器信息,同 docker inspect <容器ID或容器名>
ctr c create <镜像ID或镜像名> <容器名> # 创建容器,同 docker create,仅创建容器(容器并未运行)
2、crictl 命令
bash
# 镜像操作命令
crictl img # 查看本地镜像列表
crictl pull <镜像ID或镜像名> # 拉取远程镜像
crictl rmi <镜像ID或镜像名> # 删除本地镜像
# 容器操作命令
crictl ps -a # 查看容器列表
crictl rm <容器ID或容器名> # 删除容器
crictl logs <容器ID或容器名> # 查看容器日志
crictl stats / statsp # 查看容器 / Pod 资源使用情况