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
相关推荐
_叶小格_17 小时前
ansible自动化入门基础
运维·笔记·学习·自动化·ansible
2501_9462055217 小时前
自动化设备常用滚珠丝杠厂家排名,哪家适配性更出色
运维·自动化
思茂信息18 小时前
CST电动汽车EMC仿真(三)——初探轴电压
运维·服务器·单片机·嵌入式硬件·cst·电磁仿真·天线仿真
实战项目18 小时前
集群负载均衡关键技术研究
运维·负载均衡
bentengjiayou18 小时前
K8S是用来解决什么问题的?
云原生·容器·kubernetes
JZC_xiaozhong18 小时前
企业多系统审批流程如何打通?一文详解跨系统流程自动化方案
运维·自动化·流程自动化·数据集成与应用集成·业务流程管理·流程设计可视化·流程监控
信创天地18 小时前
AI + 信创双轮驱动:从自主可控到智能引领,重塑数字经济新范式
运维·人工智能·网络安全·系统架构·系统安全·运维开发
开开心心就好18 小时前
免费无广告卸载工具,轻便安全适配全用户
linux·运维·服务器·网络·安全·启发式算法·1024程序员节
Tummer836318 小时前
Docker迁移(N8N项目)
docker·容器
only°夏至besos18 小时前
MySQL 运维实战:常见问题排查与解决方案
运维·数据库·mysql