取代Docker!Containerd超全实战教程:安装配置+镜像/容器管理+Harbor集成
摘要:随着 Kubernetes 1.20 正式弃用 Docker 容器运行时,Containerd彻底成为云原生场景下的主流容器运行工具。作为 Docker 剥离独立的工业级容器运行时,它更轻量、性能更优、适配 K8s 生态,是云原生运维必备核心技能。本文基于 CentOS Stream 8 环境,从零梳理 Containerd 核心原理、两种安装方式、镜像容器全生命周期管理、私有仓库集成,以及 nerdctl、crictl 两大实用工具实操,全程干货可直接落地!
一、Containerd 核心介绍与发展历程
1.1 什么是 Containerd?
Containerd 是一款开源、工业级的容器运行时,由 Docker 剥离独立迭代,目前归属 CNCF 基金会管理,核心定位是底层容器运行基础设施,不直接面向终端用户,主要集成于 Kubernetes、Swarm 等编排系统。
核心特性:
-
采用 C/S 架构,通过 gRPC API 提供稳定的容器管理能力
-
仅专注容器运行时管理,轻量化、稳定性远超 Docker
-
兼容 OCI 规范,配合 runC 实现容器启动、停止全流程
-
性能优异,容器启停、删除效率优于 Docker、cri-o
1.2 前世今生:为何取代 Docker?
-
2016 年:Docker 1.11 内置 Containerd,后续正式剥离为独立项目
-
2017 年:Docker 放弃编排市场,宣布原生支持 Kubernetes,将 Containerd 捐赠给 CNCF
-
2020 年:Kubernetes 1.20 移除 Docker 适配垫片(shim),正式将 Containerd 作为默认容器运行时
核心原因:Docker 包含大量冗余功能,而 Containerd 专注底层运行时,更适配 K8s 轻量化、标准化的运行需求。
1.3 核心架构
Containerd 采用模块化插件架构,核心分为三大模块、两大子系统:
三大模块:
- Storage(存储层):负责镜像二进制内容、文件系统快照管理。包含 Content、Snapshot、Diff 组件。Content 存放镜像原始 blob 数据;Snapshot 管理镜像分层文件系统,就是容器 rootfs 来源;Diff 用于镜像层差分计算。
- Metadata(元数据层):使用 BoltDB 数据库,保存镜像、静态容器、任务、事件的元数据记录。注意这里不保存镜像真实文件,只保存引用关系。
container代表静态容器对象;task代表容器正在运行的进程任务。 - Runtime(运行时层):由
containerd‑shim+ runc 组成,对接操作系统,创建 namespace、cgroups,真正启动容器进程。因为 shim 独立进程运行,重启 containerd 主守护进程,不会杀死正在运行的业务容器。
核心子系统
-
Bundle 子系统:管理容器配置、元数据、根文件系统,支持镜像打包与提取
-
Runtime 子系统:基于 runC 执行容器,完成容器创建、运行等核心操作
核心插件
-
Content Plugin:存储镜像不可变内容,提供镜像内容寻址能力
-
Snapshot Plugin:管理镜像分层快照,对应 Docker graphdriver 功能
-
Metrics Plugin:暴露组件监控指标,支持运维监控
二、Containerd 两种安装方式(CentOS Stream 8)
本文提供 YUM 在线安装(简单快捷)和 二进制安装(生产推荐、功能完整)两种方案,版本统一为稳定版 1.6.32。
2.1 YUM 源安装(新手首选)
基于阿里云 Docker 源安装,自动适配系统依赖,操作简单:
# 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
# 添加阿里云 docker-ce 源(包含 containerd)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
# 查看可用版本
yum list | grep containerd
# 安装 containerd
yum -y install containerd.io
# 配置开机自启并启动服务
systemctl enable containerd --now
# 验证安装
systemctl status containerd
ctr version
2.2 二进制安装(生产环境推荐)
二进制包包含 runC、CNI 网络插件,适配 K8s 集群环境,功能更完整:
步骤1:安装 Containerd 主程序
# 下载官方二进制包
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz
# 解压部署
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/
# 生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
# 启动并自启
systemctl enable containerd --now
systemctl status containerd
步骤2:安装 runC 运行时
二进制包内置 runC 依赖系统 seccomp,建议单独安装完整版:
# 下载 runc 1.3.0
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
三、Containerd 镜像全生命周期管理
Containerd 原生使用 ctr 命令管理镜像,区别于 Docker,核心支持镜像拉取、挂载、导出、导入、打标签、删除等操作。
3.1 核心命令说明
# 查看镜像管理帮助
ctr images --help
# 常用简写
ctr i ls # 查看镜像列表
ctr i pull # 拉取镜像
ctr i tag # 打标签
ctr i rm # 删除镜像
3.2 实操命令大全
# 1. 查看本地镜像
ctr images list
# 2. 拉取镜像(支持华为云镜像加速)
ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest
# 3. 镜像挂载(查看镜像内部文件)
ctr images pull 镜像地址 /mnt
ls /mnt
umount /mnt
# 4. 导出镜像为 tar 包
ctr i export --platform linux/amd64 nginx.tar 镜像地址
# 5. 导入本地镜像
ctr images import --platform linux/amd64 nginx.tar
# 6. 镜像打标签(简化镜像名)
ctr images pull 原镜像地址 nginx:latest
# 7. 删除镜像
ctr image rm nginx:latest
四、Containerd 容器管理实操
Containerd 区分静态容器(container)和动态容器(task):静态容器仅初始化资源,未运行进程;task 启动后容器才真正运行。
4.1 核心操作命令
# 1. 创建静态容器
ctr container create nginx:latest nginx1
# 2. 查看静态容器
ctr container ls
# 3. 启动容器进程(转为动态容器)
ctr task start -d nginx1
ctr task ls
# 4. 进入容器终端
ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh
# 5. 直接创建并运行容器(一步到位)
ctr run -d --net-host nginx:latest nginx2
# 6. 暂停/恢复容器
ctr tasks pause nginx2
ctr tasks resume nginx2
# 7. 停止/删除容器
ctr tasks kill nginx2
ctr tasks delete nginx2
ctr container delete nginx2
五、私有仓库 Harbor 集成
支持通过 http/https 协议对接私有 Harbor 仓库,实现镜像上传、拉取:
# 1. 配置域名解析
vim /etc/hosts
192.168.108.30 my.harbor.com
# 2. 拉取私有仓库镜像(--plain-http 适配 http 协议)
ctr image pull --plain-http 192.168.108.30/cloud/nginx:latest
# 3. 本地镜像打私有仓库标签
ctr images tag nginx:latest my.harbor.com/cloud/nginx:latest
# 4. 推送镜像到 Harbor
ctr image push --platform linux/amd64 --plain-http --user "images_admin:Cloud12#$" my.harbor.com/cloud/nginx:latest
六、命名空间(Namespace)隔离管理
Containerd 命名空间用于隔离不同环境的容器、镜像,实现多环境隔离,默认使用 default 命名空间。
# 查看命名空间
ctr namespace ls
# 创建自定义命名空间
ctr namespace create myns
# 在指定命名空间操作镜像/容器
ctr -n myns images ls
ctr -n myns images pull 镜像地址
ctr -n myns container create 镜像名 容器名
# 删除命名空间
ctr namespace rm testns
七、神器推荐:nerdctl(Docker 兼容命令)
nerdctl 是 Containerd 适配 Docker CLI 的工具,命令与 Docker 完全一致,解决 ctr 命令繁琐的问题,新手零门槛上手。
7.1 安装配置
# 安装 nerdctl
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/
# 安装 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
# 配置命令补全
yum install -y bash-completion
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl
7.2 镜像加速配置
# 手动生成默认配置文件
containerd config default > /etc/containerd/config.toml
# 编辑 containerd 配置
vim /etc/containerd/config.toml
# 找到 registry 模块,添加镜像加速
# 147行修改 config_path = "/etc/containerd/certs.d"
# 创建加速配置目录
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
7.3 常用 Docker 风格命令
# 镜像管理
nerdctl images # 查看镜像
nerdctl pull busybox # 拉取镜像
nerdctl rmi 镜像名 # 删除镜像
nerdctl save/load # 镜像导入导出
# 容器管理
nerdctl ps # 查看容器
nerdctl run -d nginx # 运行容器
nerdctl exec -it 容器id bash # 进入容器
nerdctl stop/rm 容器id # 停止/删除容器
# 网络/存储管理
nerdctl network ls # 查看网络
nerdctl volume ls # 查看数据卷
八、K8s 专用工具:crictl 实操
crictl 是 K8s 官方 CRI 接口工具,专门用于集群内容器、镜像排查,是 K8s 运维必备工具。
8.1 安装与配置
# 添加 K8s 阿里云源
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
# 安装工具
yum install -y cri-tools
# 配置对接 containerd
vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false
8.2 核心常用命令
crictl images # 查看集群镜像
crictl ps # 查看运行容器
crictl pull # 拉取镜像
crictl logs # 查看容器日志
crictl exec # 进入容器
crictl rm/rmi # 删除容器/镜像
九、主流容器命令对照表
汇总 Docker / nerdctl / ctr / crictl 核心命令,一键查阅,告别命令混淆:
| 命令功能 | docker | podman | nerdctl | ctr | crictl |
|---|---|---|---|---|---|
| 查看容器状态 | docker ps | podman ps | nerdctl ps | ctr task ls / ctr container ls | crictl ps |
| 查看镜像 | docker images | podman images | nerdctl images | ctr image ls | crictl images |
| 查看容器日志 | docker logs | podman logs | nerdctl logs | 无 | crictl logs |
| 查看容器信息 | docker inspect | podman inspect | nerdctl inspect | ctr container info | crictl inspect |
| 查看容器资源 | docker stats | podman stats | nerdctl stats | 无 | crictl stats |
| 运行新容器 | docker run | podman run | nerdctl run | ctr run | 无 |
| 修改镜像标签 | docker tag | podman tag | nerdctl tag | ctr image tag | 无 |
| 创建新容器 | docker create | podman create | nerdctl create | ctr container create | crictl create |
| 导入镜像 | docker load | podman load | nerdctl load | ctr image import | 无 |
| 导出镜像 | docker save | podman save | nerdctl save | ctr image export | 无 |
| 删除容器 | docker rm | podman rm | nerdctl rm | ctr container rm | crictl rm |
| 删除镜像 | docker rmi | podman rmi | nerdctl rmi | ctr image rm | crictl rmi |
| 拉取镜像 | docker pull | podman pull | nerdctl pull | ctr image pull | crictl pull |
| 推送镜像 | docker push | podman push | nerdctl push | ctr image push | 无 |
| 在容器内执行命令 | docker exec | podman exec | nerdctl exec | 无 | crictl exec |
十、总结
1. Containerd 是云原生时代的标准容器运行时,替代 Docker 已成必然趋势,轻量化、高性能、适配 K8s 是核心优势;
2. 生产环境优先选择二进制安装,自带完整网络、运行时依赖,适配集群环境;
3. 日常运维推荐使用 nerdctl(兼容 Docker 命令),K8s 集群排查使用 crictl,原生 ctr 适合底层精细化操作;
4. 支持私有仓库、镜像加速、命名空间隔离,完全满足企业级容器运维需求。

2170

被折叠的 条评论
为什么被折叠?



