个人用云计算学习笔记 --33 Containerd

文章目录

  • Containerd
    • [一、Containerd 基础介绍](#一、Containerd 基础介绍)
      • [1. 核心定位与目标](#1. 核心定位与目标)
      • [2. 性能优势](#2. 性能优势)
    • [二、Containerd 架构](#二、Containerd 架构)
      • [1. 核心架构设计](#1. 核心架构设计)
      • [2. 常用核心插件](#2. 常用核心插件)
    • [三、Containerd 安装(CentOS Stream 8)](#三、Containerd 安装(CentOS Stream 8))
      • [1. YUM 方式安装(推荐,简单高效)](#1. YUM 方式安装(推荐,简单高效))
      • [2. 二进制方式安装(适合 K8s 集群场景)](#2. 二进制方式安装(适合 K8s 集群场景))
    • [四、Containerd 核心操作(ctr 命令)](#四、Containerd 核心操作(ctr 命令))
      • [1. 镜像管理](#1. 镜像管理)
      • [2. 容器管理(区分静态容器与动态任务)](#2. 容器管理(区分静态容器与动态任务))
      • [3. 命名空间管理(隔离容器资源)](#3. 命名空间管理(隔离容器资源))
      • [4. 私有仓库 Harbor 对接](#4. 私有仓库 Harbor 对接)
    • [五、nerdctl 实践(Docker 兼容 CLI)](#五、nerdctl 实践(Docker 兼容 CLI))
    • [六、crictl 实践(K8s CRI 专用工具)](#六、crictl 实践(K8s CRI 专用工具))
      • [1. 安装与配置](#1. 安装与配置)
      • [2. 核心操作(面向 K8s 调试)](#2. 核心操作(面向 K8s 调试))
    • 七、常用工具命令对照表

Containerd

一、Containerd 基础介绍

1. 核心定位与目标

  • 独立开源的容器运行时基础设施,脱胎于 Docker Engine,2017 年捐给 CNCF,2020 年后成为 Kubernetes 主流容器运行时(K8s 1.20+ 取消对 Docker shim 维护,Containerd 无缝对接 CRI)。
  • 非面向最终用户,专注集成到上层编排系统(Swarm、Kubernetes、Mesos 等),提供稳定的容器运行时能力。
  • 核心功能:容器生命周期管理、镜像传输与管理、存储与网络管理,支持所有 OCI 标准容器。

2. 性能优势

  • 对比 Docker、CRIO,Containerd 在容器启动、停止、删除等操作上性能更优(基于 bucketbench 测试),架构更轻量、易管理。

二、Containerd 架构

1. 核心架构设计

  • 采用 C/S 架构:服务端通过 gRPC 提供 API,客户端(如 ctr、nerdctl)调用 API 实现操作。
  • 两大子系统:
    • Bundle 子系统:处理容器文件系统(配置、元数据、根文件系统数据)的提取与打包。
    • Runtime 子系统:执行 Bundle,负责容器创建等运行时操作。
  • 核心模块划分:Storage(存储)、Metadata(元数据)、Runtime(运行时),通过插件化集成,插件间相互依赖。

2. 常用核心插件

  • Content Plugin:存储镜像的不可变可寻址内容。
  • Snapshot Plugin:管理镜像文件系统快照(类似 Docker 的 graphdriver)。
  • Metrics Plugin:暴露组件监控指标。
  • Runtime Plugin:对接 runC、kata 等运行时工具。
  • GC Plugin:负责垃圾回收,清理无用资源。

三、Containerd 安装(CentOS Stream 8)

1. YUM 方式安装(推荐,简单高效)

bash 复制代码
# 1. 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim

# 2. 添加阿里云 Docker YUM 源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache

# 3. 安装 containerd.io(含 Containerd 核心)
yum -y install containerd.io

# 4. 验证安装
rpm -qa | grep containerd

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

# 6. 验证命令可用性(ctr 为内置 CLI)
ctr version

2. 二进制方式安装(适合 K8s 集群场景)

(1)安装包选择
  • 基础包(containerd-xxx):无 runC,需单独安装。
  • 完整包(cri-containerd-cni-xxx):含 runC、K8s 所需文件,依赖系统 seccomp。
(2)安装步骤
bash 复制代码
# 1. 下载完整安装包(以 v1.6.32 为例)
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz

# 2. 解压并部署
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/

# 3. 生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

# 4. 安装 runC(二进制包含 runC,但需 seccomp 支持)
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  # 验证

# 5. 启动服务
systemctl daemon-reload
systemctl enable containerd --now

四、Containerd 核心操作(ctr 命令)

1. 镜像管理

操作 命令示例
查看镜像 ctr images list / ctr i ls
拉取镜像 ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest
挂载镜像(查看内容) ctr images mount 镜像REF /mnt
卸载镜像 umount /mnt
导出镜像 ctr i export --platform linux/amd64 nginx.img 镜像REF
导入镜像 ctr images import --platform linux/amd64 nginx.img
删除镜像 ctr image rm 镜像REF
镜像打标签 ctr images tag 原镜像REF 新镜像REF(如 ctr images tag nginx:latest mynginx:v1

2. 容器管理(区分静态容器与动态任务)

  • 静态容器(container):仅初始化配置,未运行进程;动态任务(task):容器中运行的进程。

    操作 命令示例
    查看静态容器 ctr container ls / ctr c ls
    查看动态任务 ctr task ls / ctr t ls
    创建静态容器 ctr container create nginx:latest nginx1(镜像 REF + 容器 ID)
    启动动态任务(后台) ctr task start -d nginx1
    直接运行容器(一步到位) ctr run -d --net-host nginx:latest nginx2(--net-host 共享主机网络)
    进入容器 ctr task exec --exec-id (RANDOM 生成唯一 ID)
    暂停容器 ctr tasks pause nginx2
    恢复容器 ctr tasks resume nginx2
    停止任务 ctr tasks kill nginx2
    删除任务 ctr tasks delete nginx2
    删除静态容器 ctr container delete nginx2

3. 命名空间管理(隔离容器资源)

操作 命令示例
查看命名空间 ctr namespace ls / ctr ns ls
创建命名空间 ctr namespace create myns
删除命名空间 ctr namespace rm myns
在指定命名空间操作 ctr -n myns images pull 镜像REF(拉取镜像)、ctr -n myns container create 镜像REF 容器ID

4. 私有仓库 Harbor 对接

bash 复制代码
# 1. 配置 Harbor 域名解析(如 Harbor 地址 192.168.108.30)
echo "192.168.108.30 my.harbor.com" >> /etc/hosts

# 2. 拉取 Harbor 镜像(非 HTTPS 需加 --plain-http)
ctr image pull --plain-http 192.168.108.30/cloud/nginx:latest

# 3. 推送镜像到 Harbor
ctr images tag nginx:latest my.harbor.com/cloud/nginx:latest
ctr image push --platform linux/amd64 --plain-http --user "images_admin:Cloud12#$" my.harbor.com/cloud/nginx:latest

五、nerdctl 实践(Docker 兼容 CLI)

1. 安装与配置

bash 复制代码
# 1. 下载并安装 nerdctl(v1.4.0 为例)
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. 配置命令自动补全
yum install -y bash-completion
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

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

# 4. 配置镜像加速(修改 containerd 配置)
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml  # 找到 [plugins."io.containerd.grpc.v1.cri".registry]
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

2. 核心操作(与 Docker 命令高度兼容)

(1)镜像管理
bash 复制代码
nerdctl images  # 查看镜像(同 docker images)
nerdctl pull nginx  # 拉取镜像(同 docker pull)
nerdctl tag nginx nginx:v1  # 打标签(同 docker tag)
nerdctl save nginx -o nginx.tar  # 导出镜像(同 docker save)
nerdctl load -i nginx.tar  # 导入镜像(同 docker load)
nerdctl rmi nginx:v1  # 删除镜像(同 docker rmi)
nerdctl image prune --all --force  # 清理无用镜像
(2)容器管理
bash 复制代码
nerdctl run -d --name nginx1 -p 8080:80 nginx  # 运行容器(同 docker run)
nerdctl ps  # 查看运行容器(同 docker ps)
nerdctl ps -a  # 查看所有容器(同 docker ps -a)
nerdctl exec -it nginx1 bash  # 进入容器(同 docker exec)
nerdctl logs nginx1  # 查看日志(同 docker logs)
nerdctl stop nginx1  # 停止容器(同 docker stop)
nerdctl start nginx1  # 启动容器(同 docker start)
nerdctl rm nginx1  # 删除容器(同 docker rm)
nerdctl container prune --force  # 清理停止容器
nerdctl commit nginx1 nginx:custom  # 提交容器为镜像(同 docker commit)
(3)网络管理
bash 复制代码
nerdctl network ls  # 查看网络(同 docker network ls)
nerdctl network inspect bridge  # 查看网络详情
nerdctl run -d --net host busybox sleep infinity  # 使用主机网络
(4)存储管理
bash 复制代码
nerdctl volume ls  # 查看卷(同 docker volume ls)
nerdctl run -d -v /host/data:/container/data busybox sleep infinity  # 绑定挂载
nerdctl run -d -v myvol:/data busybox sleep infinity  # 使用命名卷
(5)命名空间管理
bash 复制代码
nerdctl namespace ls  # 查看命名空间
nerdctl namespace create testns  # 创建命名空间
nerdctl -n testns run -d nginx  # 在指定命名空间运行容器

六、crictl 实践(K8s CRI 专用工具)

1. 安装与配置

bash 复制代码
# 1. 配置 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

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

# 3. 配置对接 Containerd
vim /etc/crictl.yaml
# 添加:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false

# 或通过命令配置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

2. 核心操作(面向 K8s 调试)

(1)镜像操作
bash 复制代码
crictl images  # 查看镜像
crictl pull httpd  # 拉取镜像
crictl rmi 镜像ID  # 删除镜像
crictl inspecti 镜像ID  # 查看镜像详情
(2)容器操作
bash 复制代码
crictl ps  # 查看运行容器
crictl ps -a  # 查看所有容器
crictl exec -it 容器ID sh  # 进入容器
crictl logs 容器ID  # 查看容器日志
crictl stop 容器ID  # 停止容器
crictl rm 容器ID  # 删除容器
crictl stats  # 查看容器资源占用
(3)Pod 操作(K8s 特有)
bash 复制代码
crictl pods  # 查看 Pod
crictl runp pod配置.json  # 运行 Pod
crictl inspectp PodID  # 查看 Pod 详情
crictl stopp PodID  # 停止 Pod
crictl rmp PodID  # 删除 Pod

七、常用工具命令对照表

功能 Docker nerdctl ctr crictl
查看容器状态 docker ps nerdctl ps ctr task ls / ctr c ls crictl ps
查看镜像 docker images nerdctl images ctr i ls crictl images
查看容器日志 docker logs nerdctl logs crictl logs
查看容器详情 docker inspect nerdctl inspect ctr container info crictl inspect
运行容器 docker run nerdctl run ctr run
创建静态容器 docker create nerdctl create ctr container create crictl create
拉取镜像 docker pull nerdctl pull ctr image pull crictl pull
推送镜像 docker push nerdctl push ctr image push
删除容器 docker rm nerdctl rm ctr container rm crictl rm
删除镜像 docker rmi nerdctl rmi ctr image rm crictl rmi
进入容器执行命令 docker exec nerdctl exec ctr task exec crictl exec
镜像打标签 docker tag nerdctl tag ctr image tag
导入镜像 docker load nerdctl load ctr image import
导出镜像 docker save nerdctl save ctr image export

工具差异说明

  • nerdctl:Docker CLI 兼容,功能全面(支持网络、存储、命名空间),适合日常容器管理。
  • ctr:Containerd 内置调试工具,无兼容性封装,适合底层操作与问题排查。
  • crictl:K8s CRI 标准工具,专注 K8s 集群中容器运行时调试,支持 Pod 相关操作。
相关推荐
工程师华哥2 小时前
2026新版华为数通认证HCIP-CT题库试卷,涵盖拖拽题、判断题、填空题、多选题、单选题等多种考试题型和题目(附答案解析)
运维·网络工程师·华为认证·华为hcip·华为数通认证·核心路由·hcip题库
丝斯20112 小时前
AI学习笔记整理(40)——自然语言处理算法之Seq2Seq
人工智能·笔记·学习
lbb 小魔仙2 小时前
【Linux】Linux 安全实战:防火墙配置 + 漏洞修复,符合企业合规标准
linux·运维·安全
凢en2 小时前
MAS(Micro-Architecture Specification)
笔记
_OP_CHEN2 小时前
【测试理论与实践】(三)测试BUG篇:从 BUG 本质到实战博弈,带你吃透软件测试的核心逻辑
运维·测试开发·产品运营·bug·压力测试·测试
iconball2 小时前
个人用云计算学习笔记 --35 Ceph 分布式存储
运维·笔记·ceph·学习·云计算
oMcLin2 小时前
如何在 Linux 上打开和编辑 Apple iWork 文件(增强版)
linux·运维·服务器
Ares-Wang2 小时前
网络》》FTP、TFTP、Telnet DHCP
运维·服务器·网络
艾莉丝努力练剑2 小时前
【Linux进程(七)】进程虚拟地址空间详解:从概念到实现与设计哲学
java·linux·运维·服务器·人工智能·安全·进程