个人用云计算学习笔记 --33 Containerd
摘要: Containerd是轻量级容器运行时,脱胎于Docker并成为Kubernetes默认运行时。其核心功能包括容器生命周期管理、镜像传输及存储网络管理,性能优于Docker且架构更轻量。采用C/S架构,通过插件化设计支持运行时、快照管理等核心功能。安装可通过YUM或二进制包,集成runC并兼容OCI标准。操作上,使用ctr命令管理镜像(拉取/导出/删除)、容器(创建/启动/进入)及命名空间
·
文章目录
Containerd
一、Containerd 基础介绍
1. 核心定位与目标
- 独立开源的容器运行时基础设施,脱胎于 Docker Engine,2017 年捐给 CNCF,2020 年后成为 Kubernetes 主流容器运行时(K8s 1.20+ 取消对 Docker shim 维护,Containerd 无缝对接 CRI)。
- 非面向最终用户,专注集成到上层编排系统(Swarm、Kubernetes、Mesos 等),提供稳定的容器运行时能力。
- 核心功能:容器生命周期管理、镜像传输与管理、存储与网络管理,支持所有 OCI 标准容器。
2. 性能优势
- 对比 Docker、CRIO,Containerd 在容器启动、停止、删除等操作上性能更优(基于 bucketbench 测试),架构更轻量、易管理。
二、Containerd 架构
1. 核心架构设计
- 采用 C/S 架构:服务端通过 gRPC 提供 API,客户端(如 ctr、nerdctl)调用 API 实现操作。
- 两大子系统:
- Bundle 子系统:处理容器文件系统(配置、元数据、根文件系统数据)的提取与打包。
- Runtime 子系统:执行 Bundle,负责容器创建等运行时操作。
- 核心模块划分:Storage(存储)、Metadata(元数据)、Runtime(运行时),通过插件化集成,插件间相互依赖。
2. 常用核心插件
- Content Plugin:存储镜像的不可变可寻址内容。
- Snapshot Plugin:管理镜像文件系统快照(类似 Docker 的 graphdriver)。
- Metrics Plugin:暴露组件监控指标。
- Runtime Plugin:对接 runC、kata 等运行时工具。
- GC Plugin:负责垃圾回收,清理无用资源。
三、Containerd 安装(CentOS Stream 8)
1. YUM 方式安装(推荐,简单高效)
# 1. 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
# 2. 添加阿里云 Docker YUM 源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
# 3. 安装 containerd.io(含 Containerd 核心)
yum -y install containerd.io
# 4. 验证安装
rpm -qa | grep containerd
# 5. 启动并设置开机自启
systemctl enable containerd --now
systemctl status containerd
# 6. 验证命令可用性(ctr 为内置 CLI)
ctr version
2. 二进制方式安装(适合 K8s 集群场景)
(1)安装包选择
- 基础包(containerd-xxx):无 runC,需单独安装。
- 完整包(cri-containerd-cni-xxx):含 runC、K8s 所需文件,依赖系统 seccomp。
(2)安装步骤
# 1. 下载完整安装包(以 v1.6.32 为例)
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz
# 2. 解压并部署
mkdir containerd
tar xf cri-containerd-cni-1.6.32-linux-amd64.tar.gz -C containerd/
cp containerd/usr/local/bin/* /usr/local/bin
cp containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/
# 3. 生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
# 4. 安装 runC(二进制包含 runC,但需 seccomp 支持)
wget https://github.com/opencontainers/runc/releases/download/v1.3.0/runc.amd64
mv runc.amd64 /usr/sbin/runc
chmod +x /usr/sbin/runc
runc -v # 验证
# 5. 启动服务
systemctl daemon-reload
systemctl enable containerd --now
四、Containerd 核心操作(ctr 命令)
1. 镜像管理
| 操作 | 命令示例 |
|---|---|
| 查看镜像 | ctr images list / ctr i ls |
| 拉取镜像 | ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest |
| 挂载镜像(查看内容) | ctr images mount 镜像REF /mnt |
| 卸载镜像 | umount /mnt |
| 导出镜像 | ctr i export --platform linux/amd64 nginx.img 镜像REF |
| 导入镜像 | ctr images import --platform linux/amd64 nginx.img |
| 删除镜像 | ctr image rm 镜像REF |
| 镜像打标签 | ctr images tag 原镜像REF 新镜像REF(如 ctr images tag nginx:latest mynginx:v1) |
2. 容器管理(区分静态容器与动态任务)
-
静态容器(container):仅初始化配置,未运行进程;动态任务(task):容器中运行的进程。
操作 命令示例 查看静态容器 ctr container ls / ctr c ls 查看动态任务 ctr task ls / ctr t ls 创建静态容器 ctr container create nginx:latest nginx1(镜像 REF + 容器 ID) 启动动态任务(后台) ctr task start -d nginx1 直接运行容器(一步到位) ctr run -d --net-host nginx:latest nginx2(–net-host 共享主机网络) 进入容器 ctr task exec --exec-id (RANDOM 生成唯一 ID) 暂停容器 ctr tasks pause nginx2 恢复容器 ctr tasks resume nginx2 停止任务 ctr tasks kill nginx2 删除任务 ctr tasks delete nginx2 删除静态容器 ctr container delete nginx2
3. 命名空间管理(隔离容器资源)
| 操作 | 命令示例 |
|---|---|
| 查看命名空间 | ctr namespace ls / ctr ns ls |
| 创建命名空间 | ctr namespace create myns |
| 删除命名空间 | ctr namespace rm myns |
| 在指定命名空间操作 | ctr -n myns images pull 镜像REF(拉取镜像)、ctr -n myns container create 镜像REF 容器ID |
4. 私有仓库 Harbor 对接
# 1. 配置 Harbor 域名解析(如 Harbor 地址 192.168.108.30)
echo "192.168.108.30 my.harbor.com" >> /etc/hosts
# 2. 拉取 Harbor 镜像(非 HTTPS 需加 --plain-http)
ctr image pull --plain-http 192.168.108.30/cloud/nginx:latest
# 3. 推送镜像到 Harbor
ctr images tag nginx:latest my.harbor.com/cloud/nginx:latest
ctr image push --platform linux/amd64 --plain-http --user "images_admin:Cloud12#$" my.harbor.com/cloud/nginx:latest
五、nerdctl 实践(Docker 兼容 CLI)
1. 安装与配置
# 1. 下载并安装 nerdctl(v1.4.0 为例)
wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz
tar -xf nerdctl-1.4.0-linux-amd64.tar.gz -C /usr/bin/
# 2. 配置命令自动补全
yum install -y bash-completion
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl
# 3. 安装 CNI 插件(网络支持)
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
# 4. 配置镜像加速(修改 containerd 配置)
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml # 找到 [plugins."io.containerd.grpc.v1.cri".registry]
mkdir -p /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml
# 添加:server = "https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"
# [host."https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
# capabilities = ["pull", "resolve"]
systemctl restart containerd
2. 核心操作(与 Docker 命令高度兼容)
(1)镜像管理
nerdctl images # 查看镜像(同 docker images)
nerdctl pull nginx # 拉取镜像(同 docker pull)
nerdctl tag nginx nginx:v1 # 打标签(同 docker tag)
nerdctl save nginx -o nginx.tar # 导出镜像(同 docker save)
nerdctl load -i nginx.tar # 导入镜像(同 docker load)
nerdctl rmi nginx:v1 # 删除镜像(同 docker rmi)
nerdctl image prune --all --force # 清理无用镜像
(2)容器管理
nerdctl run -d --name nginx1 -p 8080:80 nginx # 运行容器(同 docker run)
nerdctl ps # 查看运行容器(同 docker ps)
nerdctl ps -a # 查看所有容器(同 docker ps -a)
nerdctl exec -it nginx1 bash # 进入容器(同 docker exec)
nerdctl logs nginx1 # 查看日志(同 docker logs)
nerdctl stop nginx1 # 停止容器(同 docker stop)
nerdctl start nginx1 # 启动容器(同 docker start)
nerdctl rm nginx1 # 删除容器(同 docker rm)
nerdctl container prune --force # 清理停止容器
nerdctl commit nginx1 nginx:custom # 提交容器为镜像(同 docker commit)
(3)网络管理
nerdctl network ls # 查看网络(同 docker network ls)
nerdctl network inspect bridge # 查看网络详情
nerdctl run -d --net host busybox sleep infinity # 使用主机网络
(4)存储管理
nerdctl volume ls # 查看卷(同 docker volume ls)
nerdctl run -d -v /host/data:/container/data busybox sleep infinity # 绑定挂载
nerdctl run -d -v myvol:/data busybox sleep infinity # 使用命名卷
(5)命名空间管理
nerdctl namespace ls # 查看命名空间
nerdctl namespace create testns # 创建命名空间
nerdctl -n testns run -d nginx # 在指定命名空间运行容器
六、crictl 实践(K8s CRI 专用工具)
1. 安装与配置
# 1. 配置 K8s YUM 源
vim /etc/yum.repos.d/kubernetes.repo
# 添加:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
# 2. 安装 cri-tools(含 crictl)
yum install -y cri-tools
# 3. 配置对接 Containerd
vim /etc/crictl.yaml
# 添加:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false
# 或通过命令配置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
2. 核心操作(面向 K8s 调试)
(1)镜像操作
crictl images # 查看镜像
crictl pull httpd # 拉取镜像
crictl rmi 镜像ID # 删除镜像
crictl inspecti 镜像ID # 查看镜像详情
(2)容器操作
crictl ps # 查看运行容器
crictl ps -a # 查看所有容器
crictl exec -it 容器ID sh # 进入容器
crictl logs 容器ID # 查看容器日志
crictl stop 容器ID # 停止容器
crictl rm 容器ID # 删除容器
crictl stats # 查看容器资源占用
(3)Pod 操作(K8s 特有)
crictl pods # 查看 Pod
crictl runp pod配置.json # 运行 Pod
crictl inspectp PodID # 查看 Pod 详情
crictl stopp PodID # 停止 Pod
crictl rmp PodID # 删除 Pod
七、常用工具命令对照表
| 功能 | Docker | nerdctl | ctr | crictl |
|---|---|---|---|---|
| 查看容器状态 | docker ps | nerdctl ps | ctr task ls / ctr c ls | crictl ps |
| 查看镜像 | docker images | nerdctl images | ctr i ls | crictl images |
| 查看容器日志 | docker logs | nerdctl logs | 无 | crictl logs |
| 查看容器详情 | docker inspect | nerdctl inspect | ctr container info | crictl inspect |
| 运行容器 | docker run | nerdctl run | ctr run | 无 |
| 创建静态容器 | docker create | nerdctl create | ctr container create | crictl create |
| 拉取镜像 | docker pull | nerdctl pull | ctr image pull | crictl pull |
| 推送镜像 | docker push | nerdctl push | ctr image push | 无 |
| 删除容器 | docker rm | nerdctl rm | ctr container rm | crictl rm |
| 删除镜像 | docker rmi | nerdctl rmi | ctr image rm | crictl rmi |
| 进入容器执行命令 | docker exec | nerdctl exec | ctr task exec | crictl exec |
| 镜像打标签 | docker tag | nerdctl tag | ctr image tag | 无 |
| 导入镜像 | docker load | nerdctl load | ctr image import | 无 |
| 导出镜像 | docker save | nerdctl save | ctr image export | 无 |
工具差异说明
- nerdctl:Docker CLI 兼容,功能全面(支持网络、存储、命名空间),适合日常容器管理。
- ctr:Containerd 内置调试工具,无兼容性封装,适合底层操作与问题排查。
- crictl:K8s CRI 标准工具,专注 K8s 集群中容器运行时调试,支持 Pod 相关操作。
更多推荐



所有评论(0)