容器运行时Containerd完整学习笔记|原理、安装、ctr/nerdctl/crictl实操全梳理

一、什么是 Containerd

Containerd 是工业级容器运行时,从Docker Engine中剥离,捐献给CNCF云原生基金会,不面向普通终端用户,主要给上层编排工具(Kubernetes、Swarm)调用

它负责单机上全部容器相关工作:拉取镜像、管理容器生命周期、存储、网络;真正执行容器进程的是 runc,完全遵循OCI开放容器规范。

发展历史关键点:

  1. Google联合红帽、IBM推动libcontainer开源为 runC,成立OCI规范组织。
  2. Docker内部核心组件containerd独立出来,后续捐赠CNCF。
  3. K8s 1.20起正式放弃dockershim,containerd成为K8s默认容器运行时。

Containerd整体架构

采用C/S架构,服务端提供gRPC接口,各类客户端调用API完成操作。 整体分为三大模块:

  1. Storage存储层:存放镜像layer快照、镜像元数据
  2. Metadata元数据层:记录容器、镜像、任务、lease等元信息
  3. 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

六、总结

  1. containerd是OCI标准容器运行时,承接Kubernetes的CRI请求,底层调用runc真正运行容器。
  2. 部署支持yum源、二进制包两种方式,二进制包版本可控,生产环境更常用。
  3. 三套客户端各有定位:ctr底层调试;nerdctl兼容docker命令适合开发实训;crictl站在k8s角度调试排错。
  4. containerd支持namespace做容器资源隔离,支持对接私有Harbor仓库,镜像加速采用certs.d目录配置方式。

学习建议:实际环境优先使用nerdctl,上手成本最低;排查k8s容器异常优先使用crictl。

相关推荐
是个西兰花1 小时前
UDP套接字编程
运维·服务器·网络
是店小二呀4 小时前
鸿蒙PC_Dart-Sass-ohos适配全记录
linux·运维·windows
智能运维指南10 小时前
代码管理软件如何融入 DevOps 工具链?全链路联通的 5 个关键点
运维·devops·信创适配·嘉为蓝鲸
充电zcx10 小时前
Linux:4:开发工具详解
linux·运维·服务器
九皇叔叔12 小时前
Kubernetes 核心概念:集群架构、核心组件与资源对象
docker·容器·kubernetes·k8s
rustfs12 小时前
MinIO 国产开源平替正式 GA
分布式·docker·云原生·rust
gongfeng300014 小时前
福州企业级AI自动化获客解决方案品牌梳理与适用场景分析
运维·人工智能·自动化·g-claw ai员工
光电笑映16 小时前
网络通信基础:从协议分层到 Socket 编程预备
linux·运维·服务器·网络
微小冷16 小时前
用Mermaid画时序图
运维·流程图·时序图·mermaid·生命线