Containerd 从入门到实战

文章目录

  • [Containerd 从入门到实战](#Containerd 从入门到实战)
    • 引言
    • [一、Containerd 核心亮点](#一、Containerd 核心亮点)
    • [二、环境部署(CentOS Stream 8 实操)](#二、环境部署(CentOS Stream 8 实操))
      • [1. 两种安装方式(优先 YUM 安装)](#1. 两种安装方式(优先 YUM 安装))
        • [(1)YUM 安装(推荐,简单高效)](#(1)YUM 安装(推荐,简单高效))
        • [(2)二进制安装(K8s 集群推荐)](#(2)二进制安装(K8s 集群推荐))
      • [2. 关键配置(镜像加速 + CRI 适配 K8s)](#2. 关键配置(镜像加速 + CRI 适配 K8s))
    • 三、核心概念速通
      • [1. 架构概览](#1. 架构概览)
      • [2. 关键术语](#2. 关键术语)
    • [四、核心操作实战(ctr 命令)](#四、核心操作实战(ctr 命令))
      • [1. 镜像管理](#1. 镜像管理)
      • [2. 容器管理](#2. 容器管理)
      • [3. 命名空间管理](#3. 命名空间管理)
      • [4. 私有仓库集成(Harbor 为例)](#4. 私有仓库集成(Harbor 为例))
    • [五、实用工具:nerdctl(Docker 兼容客户端)](#五、实用工具:nerdctl(Docker 兼容客户端))
      • [1. 安装 nerdctl](#1. 安装 nerdctl)
      • [2. 常用命令(与 Docker 无缝衔接)](#2. 常用命令(与 Docker 无缝衔接))
    • 六、调试工具:crictl
      • [1. 安装与配置](#1. 安装与配置)
      • [2. 常用调试命令](#2. 常用调试命令)
    • [七、核心命令对比表(Docker -> Containerd 迁移参考)](#七、核心命令对比表(Docker -> Containerd 迁移参考))
    • 八、总结

Containerd 从入门到实战

引言

随着 Kubernetes 逐步弃用 Docker 作为默认容器运行时,Containerd 凭借其轻量、稳定、原生兼容 K8s 的特性,成为云原生生态的核心组件。它脱胎于 Docker,专注于容器运行时核心功能,剥离了 Docker 多余的构建、编排功能,性能更优、资源占用更低。~

一、Containerd 核心亮点

  • 轻量高效:仅保留容器运行时核心功能(镜像管理、容器生命周期、网络 / 存储),剔除冗余模块,资源占用仅为 Docker 的 1/3。
  • OCI 兼容:遵循 Open Container Initiative(OCI)规范,支持所有 Docker 构建的镜像,无缝迁移。
  • K8s 原生集成:无需中间垫片(shim),直接实现 K8s 的 CRI(Container Runtime Interface)接口,部署更简单、稳定性更高。
  • 架构解耦:采用 C/S 架构 + 插件化设计,核心功能模块化(镜像、容器、快照、GC 等),易于扩展和维护。
  • 高性能:相比 Docker 和 CRI-O,在容器启动、停止、删除等操作上性能更优,适合大规模容器集群场景。

二、环境部署(CentOS Stream 8 实操)

1. 两种安装方式(优先 YUM 安装)

(1)YUM 安装(推荐,简单高效)
bash 复制代码
# 1. 安装基础依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 vim

# 2. 配置阿里云 Docker 源(包含 Containerd 包)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

# 3. 安装 Containerd(默认包含 runc)
yum install -y containerd.io

# 4. 启动并设置开机自启
systemctl enable containerd --now

# 5. 验证安装(显示客户端/服务端版本即成功)
ctr version
(2)二进制安装(K8s 集群推荐)

适用于需要定制配置的场景,核心步骤:

bash 复制代码
# 1. 下载包含 CNI 和 runc 的安装包
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz

# 2. 解压并部署二进制文件
mkdir -p /opt/containerd
tar xf cri-containerd-cni-1.6.32-linux-amd64.tar.gz -C /opt/containerd

# 3. 复制运行时文件和系统服务
cp /opt/containerd/usr/local/bin/* /usr/local/bin/
cp /opt/containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/

# 4. 生成默认配置并启动
containerd config default > /etc/containerd/config.toml
systemctl daemon-reload && systemctl enable containerd --now

2. 关键配置(镜像加速 + CRI 适配 K8s)

(1)配置镜像加速(国内必配)
bash 复制代码
# 编辑配置文件
vim /etc/containerd/config.toml

# 找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 节点,添加阿里云加速
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://xxxx.mirror.aliyuncs.com"]  # 替换为自己的加速地址

# 重启 Containerd 生效
systemctl restart containerd
(2)适配 K8s 配置(可选)

若用于 K8s 集群,需修改运行时参数:

bash 复制代码
# 在 config.toml 中设置 SystemdCgroup = true(适配 K8s 容器组管理)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

systemctl restart containerd

三、核心概念速通

1. 架构概览

Containerd 采用 C/S 架构,核心分为三层:

  • 客户端:通过 gRPC 与服务端通信(常用客户端:ctr、nerdctl、crictl)。
  • 核心服务:包含镜像管理、容器生命周期、快照、命名空间等模块,均以插件形式集成。
  • 运行时:依赖 runc(默认)、kata 等 OCI 兼容运行时,负责容器实际运行。

2. 关键术语

  • 命名空间(Namespace) :实现容器 / 镜像的隔离(类似 Docker 的命名空间),默认有 default 命名空间。
  • 镜像(Image):遵循 OCI 规范的只读模板,与 Docker 镜像完全兼容。
  • 容器(Container):镜像的可运行实例,包含静态配置(Container)和动态进程(Task)。
  • 快照(Snapshot):管理镜像分层存储,类似 Docker 的 storage driver(默认使用 overlayfs)。

四、核心操作实战(ctr 命令)

ctr 是 Containerd 自带的调试客户端,适合直接操作 Containerd,常用命令如下:

1. 镜像管理

bash 复制代码
# 1. 拉取镜像(需指定完整仓库地址,支持 HTTP 私有仓库加 --plain-http)
ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest

# 2. 查看本地镜像
ctr images ls 或 ctr i ls

# 3. 镜像打标签
ctr images tag 镜像完整地址 nginx:latest

# 4. 导出镜像
ctr images export --platform linux/amd64 nginx.tar nginx:latest

# 5. 导入镜像
ctr images import nginx.tar

# 6. 删除镜像
ctr images rm nginx:latest

2. 容器管理

Containerd 中容器分为「静态容器(Container)」和「动态任务(Task)」,需先创建容器再启动任务:

bash 复制代码
# 1. 创建静态容器(基于 nginx 镜像,命名为 nginx1)
ctr container create nginx:latest nginx1

# 2. 查看静态容器
ctr container ls 或 ctr c ls

# 3. 启动容器(后台运行加 -d)
ctr task start -d nginx1

# 4. 查看运行中的任务(容器进程)
ctr task ls 或 ctr t ls

# 5. 进入容器(--exec-id 指定唯一 ID,$RANDOM 自动生成)
ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh

# 6. 暂停/恢复容器
ctr task pause nginx1
ctr task resume nginx1

# 7. 停止并删除容器(需先停任务,再删容器)
ctr task kill nginx1
ctr task delete nginx1
ctr container delete nginx1

# 8. 一键运行容器(创建+启动合并)
ctr run -d --net-host nginx:latest nginx2  # --net-host 共享宿主机网络

3. 命名空间管理

命名空间用于隔离资源,适合多环境隔离场景:

bash 复制代码
# 1. 查看所有命名空间
ctr namespace ls 或 ctr ns ls

# 2. 创建命名空间
ctr namespace create myns

# 3. 在指定命名空间操作(加 -n 参数)
ctr -n myns images pull nginx:latest
ctr -n myns container create nginx:latest mynginx
ctr -n myns task start -d mynginx

# 4. 删除命名空间(会删除命名空间内所有资源)
ctr namespace rm myns

4. 私有仓库集成(Harbor 为例)

bash 复制代码
# 1. 拉取私有仓库镜像(--plain-http 用于 HTTP 仓库,--user 指定账号密码)
ctr images pull --plain-http --user "用户名:密码" 192.168.108.30/cloud/nginx:latest

# 2. 推送镜像到私有仓库
ctr images tag nginx:latest 192.168.108.30/cloud/nginx:v1
ctr images push --plain-http --user "用户名:密码" 192.168.108.30/cloud/nginx:v1

五、实用工具:nerdctl(Docker 兼容客户端)

nerdctl 是 Containerd 的高级客户端,完全兼容 Docker CLI 命令,上手成本极低,推荐日常使用:

1. 安装 nerdctl

bash 复制代码
# 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/

# 2. 安装 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

# 3. 配置命令自动补全(可选)
yum install -y bash-completion
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

2. 常用命令(与 Docker 无缝衔接)

Docker 命令 nerdctl 命令 功能描述
docker images nerdctl images 查看本地镜像
docker pull nerdctl pull 拉取镜像
docker run -d -p nerdctl run -d -p 后台运行容器并端口映射
docker exec -it nerdctl exec -it 进入容器
docker ps nerdctl ps 查看运行中容器
docker stop/start nerdctl stop/start 停止 / 启动容器
docker rm nerdctl rm 删除容器
docker save/load nerdctl save/load 导出 / 导入镜像
实操示例:
bash 复制代码
# 1. 拉取镜像(与 Docker 命令完全一致)
nerdctl pull nginx:latest

# 2. 运行容器(端口映射 8080->80,命名为 nginx-nerdctl)
nerdctl run -d -p 8080:80 --name nginx-nerdctl nginx:latest

# 3. 查看容器和日志
nerdctl ps
nerdctl logs -f nginx-nerdctl

# 4. 数据卷挂载(持久化数据)
mkdir -p /data/nginx/html
echo "Hello Nerdctl" > /data/nginx/html/index.html
nerdctl run -d -p 8081:80 -v /data/nginx/html:/usr/share/nginx/html nginx:latest

# 5. 网络管理(创建自定义网络)
nerdctl network create mynet
nerdctl run -d --net mynet --name nginx-net nginx:latest

六、调试工具:crictl

crictl 是 K8s 社区提供的 CRI 兼容客户端,专门用于调试 K8s 节点上的容器运行时:

1. 安装与配置

bash 复制代码
# 1. 配置 K8s YUM 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

# 2. 安装 crictl
yum install -y cri-tools

# 3. 配置连接 Containerd
cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false
EOF

2. 常用调试命令

bash 复制代码
# 1. 查看镜像(K8s 节点上的所有镜像)
crictl images

# 2. 查看容器(包含 K8s 管理的容器)
crictl ps
crictl ps -a  # 查看所有容器

# 3. 查看容器日志(K8s Pod 对应的容器日志)
crictl logs 容器ID

# 4. 进入容器(调试 K8s 容器)
crictl exec -it 容器ID /bin/sh

# 5. 查看 Pod 信息(K8s Pod 对应的沙箱容器)
crictl pods

七、核心命令对比表(Docker -> Containerd 迁移参考)

功能场景 Docker 命令 nerdctl 命令 ctr 命令 crictl 命令
查看镜像 docker images nerdctl images ctr images ls crictl images
拉取镜像 docker pull nerdctl pull ctr images pull crictl pull
运行容器 docker run -d nerdctl run -d ctr run -d 无(需通过 Pod)
查看运行容器 docker ps nerdctl ps ctr task ls crictl ps
进入容器 docker exec -it nerdctl exec -it ctr task exec crictl exec -it
查看日志 docker logs -f nerdctl logs -f crictl logs
删除容器 docker rm nerdctl rm ctr container delete crictl rm
删除镜像 docker rmi nerdctl rmi ctr images rm crictl rmi
导出镜像 docker save nerdctl save ctr images export
导入镜像 docker load nerdctl load ctr images import

八、总结

Containerd 作为轻量、稳定、原生兼容 K8s 的容器运行时,已成为云原生场景的首选。核心优势在于剥离冗余功能、聚焦运行时核心,同时兼容 Docker 生态,迁移成本极低。

  • 适合场景:K8s 集群容器运行时、追求轻量高效的容器部署、多环境隔离的生产环境。
  • 工具选择:日常操作优先用 nerdctl(Docker 兼容),Containerd 调试用 ctr,K8s 节点调试用 crictl
相关推荐
HUST2 小时前
C 语言 第八讲:VS实用调试技巧
运维·c语言·开发语言·数据结构·算法·c#
信仰JR2 小时前
Linux系统使用Docker安装Ollama
运维·docker·ai
科技圈快讯2 小时前
合规与安全并重:企业如何挑选符合行业法规的网盘?
运维·网络·安全
老实巴交的麻匪3 小时前
(九)学习、实践、理解 CI/CD 与 DevOps:持续发布 CD,从容器镜像到生产环境
运维·云原生·自动化运维
泽君学长3 小时前
Docker核心技术详解与简单实战
运维·docker·容器
苦逼IT运维3 小时前
VMware Horizon 与 Docker 冲突排错记录
linux·运维·docker·容器·自动化
小李独爱秋3 小时前
Linux操作系统实验报告单(13) 显示进程列表
linux·运维·服务器·操作系统·实验报告单
艾莉丝努力练剑3 小时前
Al Ping免费上新:GLM-4.7 && MiniMaxM2.1重磅上线,附独家使用教程
java·大数据·linux·运维·人工智能·python
莫渊博-天下无病3 小时前
node高版本安装
运维·node.js