一、什么是 Containerd
Containerd 是工业级容器运行时,从Docker Engine中剥离,捐献给CNCF云原生基金会,不面向普通终端用户,主要给上层编排工具(Kubernetes、Swarm)调用。
它负责单机上全部容器相关工作:拉取镜像、管理容器生命周期、存储、网络;真正执行容器进程的是 runc,完全遵循OCI开放容器规范。
发展历史关键点:
- Google联合红帽、IBM推动libcontainer开源为 runC,成立OCI规范组织。
- Docker内部核心组件containerd独立出来,后续捐赠CNCF。
- K8s 1.20起正式放弃dockershim,containerd成为K8s默认容器运行时。
Containerd整体架构
采用C/S架构,服务端提供gRPC接口,各类客户端调用API完成操作。 整体分为三大模块:
- Storage存储层:存放镜像layer快照、镜像元数据
- Metadata元数据层:记录容器、镜像、任务、lease等元信息
- Runtime运行时层:调用runc真正启动、管理容器进程
核心插件:
- Content Plugin:镜像不可变内容存储
- Snapshot Plugin:镜像分层快照管理,类似docker graphdriver
- Runtime Plugin:对接runc,负责容器执行
- GC Plugin:垃圾回收,清理无用镜像与资源
二、Containerd两种安装方式(CentOS Stream8)
方式1:yum软件源安装
#安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim
#添加docker-ce阿里源(源中包含containerd.io包)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
#安装containerd
yum -y install containerd.io
#查看安装
rpm -qa | grep containerd
#开机自启并立即启动
systemctl enable containerd --now
systemctl status containerd
#验证版本
ctr version
方式2:二进制包安装(生产常用,可控版本)
使用
cri‑containerd‑cni完整包,内置cni网络插件、配置文件
#下载二进制包
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
#复制systemd服务单元文件
cp containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service
#生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#启动服务
systemctl daemon-reload
systemctl enable containerd --now
ctr version
补充安装 runc,保障OCI容器可以正常运行
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
三、三套客户端工具区分
| 工具 | 适用场景 | 特点 |
|---|---|---|
| ctr | containerd原生客户端 | 底层调试,命令繁琐,不推荐日常使用 |
| nerdctl | 兼容docker语法的客户端 | 命令几乎和docker一模一样,适合习惯docker的用户 |
| crictl | CRI标准客户端 | K8s视角调试,kubelet调用它和containerd交互 |
小技巧:设置别名
alias docker=nerdctl,可以直接用docker风格命令操作containerd。
3.1 ctr 原生命令实操
ctr使用namespace隔离资源,默认namespace是
default
#镜像管理
ctr images pull 镜像地址
ctr images ls
ctr images tag 原镜像 新标签
ctr images export --platform linux/amd64 nginx.tar 镜像名
ctr images import nginx.tar
ctr images rm 镜像名
#容器管理
ctr container create nginx:latest nginx1 #创建静态容器,进程未启动
ctr task start -d nginx1 #启动容器进程,变成动态运行容器
ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh #进入容器
ctr tasks kill nginx1 #停止容器进程
ctr tasks delete nginx1
ctr container delete nginx1 #删除静态容器对象
#namespace隔离
ctr namespace create myns
ctr -n myns images ls #查看指定命名空间镜像
3.2 nerdctl:类docker命令体验
安装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
常用命令,语法和docker几乎完全一致:
nerdctl pull nginx
nerdctl images
nerdctl run -d --name nginx1 nginx
nerdctl ps
nerdctl exec -it nginx1 bash
nerdctl stop nginx1
nerdctl rm nginx1
nerdctl save -o nginx.tar nginx
nerdctl load -i nginx.tar
3.3 crictl:K8s CRI接口调试工具
安装cri‑tools:
#配置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
yum install -y cri-tools
#指定后端为containerd
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
常用命令:
crictl images
crictl pull nginx
crictl ps
crictl pods
crictl logs podid
crictl exec -it podid /bin/sh
四、配置镜像加速(containerd)
containerd镜像加速推荐使用certs.d目录结构配置,不要直接修改旧mirrors字段。
vim /etc/containerd/config.toml
#找到这一行,取消注释
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://docker.io"
[host."https://docker.mirrors.ustc.edu.cn"]
capabilities = ["pull","resolve"]
重启containerd生效
systemctl restart containerd
五、对接私有Harbor仓库
如果Harbor没有配置https证书,使用http访问,拉取推送需要加参数--plain‑http
#拉取harbor镜像
ctr images pull --plain-http 192.168.108.30/cloud/nginx:latest
#打标签,推送到harbor
ctr images tag nginx:latest 192.168.108.30/cloud/nginx:latest
ctr images push --plain-http --user "admin:Harbor密码" 192.168.108.30/cloud/nginx:latest
六、总结
- containerd是OCI标准容器运行时,承接Kubernetes的CRI请求,底层调用runc真正运行容器。
- 部署支持yum源、二进制包两种方式,二进制包版本可控,生产环境更常用。
- 三套客户端各有定位:ctr底层调试;nerdctl兼容docker命令适合开发实训;crictl站在k8s角度调试排错。
- containerd支持namespace做容器资源隔离,支持对接私有Harbor仓库,镜像加速采用certs.d目录配置方式。
学习建议:实际环境优先使用nerdctl,上手成本最低;排查k8s容器异常优先使用crictl。