Containerd容器技术

基本概念

一、架构设计

Containerd 采用分层模块化架构,核心分为三层:

  1. API 层

    • 提供 gRPC 接口,支持 CRI(Container Runtime Interface)规范,兼容 Kubernetes 及自定义客户端(如 Docker CLI)。
    • 对外暴露容器生命周期管理、镜像操作等接口,同时集成 Prometheus 监控指标。
  2. Core 层

    • Bundle 子系统‌:管理容器配置(OCI Bundle),包括镜像解压、快照创建(基于 OverlayFS/ZFS 等)。
    • Runtime 子系统‌:通过 containerd-shim 调用底层运行时(如 runc),实现容器进程隔离与生命周期控制。
    • 元数据存储‌:使用 BoltDB 存储镜像、容器等持久化数据。
  3. Backend 层

    • 插件体系‌:支持可扩展的存储驱动、网络插件及运行时(如 Kata Containers、gVisor)。
    • 事件与度量‌:全局事件总线(Events)和性能指标收集(Metrics)。
    • 快照管理‌:通过 Snapshotter 实现镜像分层存储与高效容器启动。

数据流示例‌:拉取镜像 → 存储至 Content Store → 解压层为快照 → 生成 OCI Bundle → containerd-shim 调用 runc 创建容器。


二、核心原理

  1. 容器生命周期管理

    • 容器启动:通过 containerd-shim 启动 runc,创建隔离的命名空间(PID/Network/Mount 等)。
    • 进程托管:shim 作为容器的父进程,确保容器退出后资源回收,实现 daemon 无状态化。
  2. 镜像分发与存储

    • 遵循 OCI 标准,支持从仓库拉取镜像并存储为多层快照(每个层对应独立 hash)。
    • 快照复用:相同镜像层仅存储一次,新容器通过 OverlayFS 挂载写时复制(CoW)层。
  3. 安全隔离

    • 默认启用 Linux Capabilities 限制与非特权模式,支持 Seccomp/AppArmor 策略。
    • 多租户隔离:通过命名空间(Namespace)分隔不同用户或集群的容器资源。

三、关键特性

特性说明
轻量化高性能内存占用比 Docker 低 40%,容器启动延迟降至毫秒级。
标准化兼容遵循 OCI 规范,无缝集成 Kubernetes(通过 CRI)、Docker 等生态。
插件化扩展支持自定义存储驱动(ZFS)、网络插件(Cilium)、安全运行时(Kata)。
生产级可靠性支持热升级、故障恢复、多副本元数据存储。
高效存储Erofs 快照器优化只读层性能,分块拉取镜像减少网络开销。

四、技术意义

  1. 云原生基石

    • 作为 Kubernetes 默认运行时(占比超 85%),提供稳定高效的容器调度基础。
    • 解耦编排系统与底层运行时,推动生态系统标准化。
  2. 模块化演进

    • 脱离 Docker 单体架构,专注核心功能(镜像/容器/存储管理),成为“容器运行时的事实标准”。
  3. 生态协同优化

    • 通过 CRI 接口对接 Kubelet,减少组件冗余调用,提升集群性能。
    • 支持沙箱容器(如 runsc),扩展安全隔离场景。

总结‌:Containerd 通过轻量架构、开放标准及插件化设计,成为云原生时代容器管理的核心引擎,平衡了性能、灵活性与生产稳定性。

基本部署

1. 环境准备

# 安装基础依赖(适用于 CentOS/RHEL) 
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 
  • 解析‌:安装必要的存储驱动工具(如 device-mapper)和包管理工具(yum-utils)。
# 添加阿里云镜像源(国内加速) 
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo 
  • 解析‌:替换默认仓库为阿里云镜像源,加速下载速度。

2. 安装 Containerd

# 安装 containerd 和 runc(二进制全量包) 
wget https://github.com/containerd/containerd/releases/download/v1.7.14/cri-containerd-cni-1.7.14-linux-amd64.tar.gz 
tar zxf cri-containerd-cni-1.7.14-linux-amd64.tar.gz -C / 
  • 解析‌:下载官方发布的 cri-containerd-cni 包(包含 containerd、runc 和 CNI 插件),解压至根目录。
# 生成默认配置文件 
mkdir /etc/containerd 
containerd config default > /etc/containerd/config.toml 
  • 解析‌:创建配置目录并生成默认 TOML 格式配置文件,定义存储路径、运行时等参数。

3. 配置优化

# 编辑配置文件(关键参数) 
sudo nano /etc/containerd/config.toml 
  • 修改项‌:
    • 镜像加速‌:在 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 下添加阿里云镜像加速地址。
    • 存储驱动‌:设置 SystemdCgroup = true 以兼容 Kubernetes。
    • 日志级别‌:调整 level = "info" 便于调试。

4. 启动服务

# 通过 systemd 管理服务 
systemctl --now enable containerd 
  • 解析‌:启用并立即启动 containerd 守护进程。
# 验证安装 
ctr version 
  • 预期输出‌:
    Client: Version: v1.7.14 Server: Version: v1.7.14 
  • 解析‌:确认客户端和服务端版本一致。

5. 工具链补充

# 安装 nerdctl(兼容 Docker CLI 的工具) 
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-1.5.0-linux-amd64.tar.gz 
tar zxf nerdctl-1.5.0-linux-amd64.tar.gz -C /usr/local/bin 
  • 解析‌:nerdctl 提供类似 docker 的命令行体验,支持镜像和容器管理。

6. 集成 Kubernetes(可选)

# 修改 kubelet 配置 
echo 'KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"' > /etc/sysconfig/kubelet 
  • 解析‌:配置 kubelet 使用 containerd 作为 CRI 运行时。

关键点总结

  1. 模块化安装‌:选择 cri-containerd-cni 全量包避免手动组装组件。
  2. 配置优先级‌:镜像加速和存储驱动是生产环境必调参数。
  3. 生态兼容‌:通过 nerdctl 或直接调用 ctr 管理容器。
  4. K8s 集成‌:需显式指定 containerd 的 CRI 接口路径。

注:若需完整卸载,执行 rm -rf /etc/containerd 并清理 systemd 单元文件。

 命令行工具

一、ctr(Containerd 原生 CLI)

1. 镜像管理
ctr image pull docker.io/library/nginx:latest 
  • 解析‌:从 Docker Hub 拉取 Nginx 镜像,默认存储至 default 命名空间。
  • 关键参数‌:--snapshotter 可指定快照驱动(如 overlayfs)。
ctr image ls 
  • 解析‌:列出本地镜像,显示仓库名、标签及大小,格式与 docker images 类似但更精简24。
ctr image rm docker.io/library/nginx:latest 
  • 解析‌:删除指定镜像,若镜像被容器引用则需先删除容器。
2. 容器管理
ctr container create docker.io/library/nginx:latest my-nginx 
  • 解析‌:创建容器但不启动,生成 OCI 规范配置至 /var/lib/containerd
  • 命名空间‌:通过 -n k8s.io 可操作 Kubernetes 创建的容器。
ctr task start my-nginx 
  • 解析‌:启动容器任务,底层调用 runc 创建隔离进程26。
ctr task exec --exec-id sh my-nginx /bin/sh 
  • 解析‌:进入运行中的容器执行命令,--exec-id 需唯一标识会话。

二、crictl(Kubernetes CRI 工具)

1. 配置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock 
  • 解析‌:配置 CRI 接口路径,使 crictl 可管理 Containerd 运行时。
2. 容器操作
crictl ps -a 
  • 解析‌:列出所有容器(包括停止的),输出格式兼容 docker ps
  • 限制‌:仅显示 k8s.io 命名空间的容器。
crictl logs <container-id> 
  • 解析‌:查看容器日志,自动聚合 stdout/stderr 流。

三、nerdctl(Docker 风格 CLI)

1. 容器生命周期
nerdctl run -d --name web nginx:latest 
  • 解析‌:后台运行容器,支持 -p 端口映射等 Docker 兼容参数。
  • 依赖‌:需提前安装 CNI 插件以支持网络功能。
nerdctl compose up -d 
  • 解析‌:通过 Compose 文件启动多容器应用,语法与 Docker Compose 一致。
2. 镜像构建
nerdctl build -t my-app . 
  • 解析‌:使用当前目录的 Dockerfile 构建镜像,支持缓存和多阶段构建。

四、工具对比与适用场景

工具定位优势局限性
ctrContainerd 原生调试工具直接操作底层 API,适合开发调试命令冗长,功能较基础
crictlKubernetes 运维工具专为 K8s 设计,支持 Pod 级操作仅限 k8s.io 命名空间
nerdctl开发者友好型工具完全兼容 Docker CLI 习惯需额外安装 CNI/构建组件

五、底层原理补充

  1. 命名空间隔离
    • ctr -n k8s.io 与 crictl 操作同一批容器,但普通 ctr 命令默认使用 default 命名空间。
  2. CRI 接口调用
    • crictl 通过 CRI 插件与 Containerd 交互,而 ctr 直接调用 gRPC 接口。
  3. 日志存储
    • 容器日志默认存储在 /var/log/pods/<namespace>_<pod>_<id>/ 下,由 kubelet 管理。

提示‌:生产环境推荐组合使用 nerdctl(开发) + crictl(运维)。

ctr命令解析 

一、基础命令结构

ctr [全局选项] <子命令> [子命令选项] [参数] 
  • 全局选项‌:
    --address:指定 containerd 的 gRPC 套接字路径(默认 /run/containerd/containerd.sock)。
    --namespace:设置命名空间(默认 default,Kubernetes 容器需用 k8s.io)。
    --debug:启用调试日志输出。

二、镜像管理

1. 拉取镜像
ctr image pull docker.io/library/nginx:latest 
  • 解析‌:从 Docker Hub 拉取镜像,需完整指定仓库路径(docker.io/library/不可省略)。
  • 存储位置‌:镜像内容保存至 /var/lib/containerd/io.containerd.content.v1.content
2. 本地镜像操作
ctr image list 
  • 输出示例‌:
    REF             TYPE                 DIGEST 
    docker.io/library/nginx:latest application/vnd.docker.distribution.manifest.v2+json sha256:... 
  • 解析‌:列出镜像的引用、类型及摘要,无友好名称显示(对比 docker images)。
ctr image mount docker.io/library/nginx:latest /mnt/nginx 
  • 解析‌:将镜像挂载到主机目录,可直接访问其文件系统(需手动卸载 ctr image unmount /mnt/nginx)。

三、容器生命周期

1. 创建容器
ctr container create docker.io/library/nginx:latest my-nginx 
  • 解析‌:创建容器但不启动,生成 OCI 配置至 /var/lib/containerd/io.containerd.runtime.v2.task/default/my-nginx
  • 关键差异‌:无自动端口映射或后台运行选项,需手动配置。
2. 启动任务
ctr task start my-nginx 
  • 解析‌:启动容器进程,底层调用 runc 创建命名空间隔离的进程。
  • 日志查看‌:需通过 ctr task logs my-nginx 或直接访问日志文件。
3. 交互式操作
ctr task exec --exec-id sh my-nginx /bin/sh 
  • 解析‌:进入容器执行命令,--exec-id 需唯一标识会话(如随机生成 UUID)。

四、高级功能

1. 命名空间管理
ctr namespace create dev ctr -n dev image pull docker.io/alpine:latest 
  • 解析‌:隔离不同环境的资源(如开发/生产),Kubernetes 专用 k8s.io 命名空间。
2. 快照管理
ctr snapshot ls 
  • 解析‌:列出所有快照(镜像层),显示挂载点和父层关系,基于 OverlayFS 实现写时复制。

五、与 Docker 的差异对比

功能ctr 实现Docker 等效命令说明
镜像拉取ctr image pulldocker pullctr 需完整仓库路径
容器运行ctr run(直接启动)docker run -dctr 无自动后台运行选项
日志查看ctr task logsdocker logsctr 日志输出为原始流
网络配置依赖 CNI 插件手动配置Docker 原生网络驱动ctr 不集成网络功能

六、调试技巧

  1. 事件监控

    ctr events 
    • 解析‌:实时显示容器生命周期事件(创建/启动/停止)。
  2. 资源限制检查

    ctr task metrics my-nginx 
    • 输出‌:显示容器 CPU/内存/PID 使用量,需提前配置 cgroups。

注意‌:ctr 作为调试工具,命令及输出格式可能随版本变化,生产环境建议使用 nerdctl 或 crictl

### containerd 的架构设计与实现原理 #### 1. **containerd 的整体架构** containerd 是一个工业级的容器运行时,它的核心目标是提供高效、稳定和安全的容器管理能力。containerd 的架构可以分为多个层次,每一层都有特定的功能职责[^1]。 - **gRPC API 层**: 提供对外的服务接口,允许客户端通过 gRPC 协议与 containerd 进行交互。 - **服务管理层**: 负责处理来自 gRPC 请求的任务调度和服务调用。 - **任务执行层**: 主要用于管理和控制容器的实际生命周期操作,例如创建、启动、停止等。 - **存储层**: 管理镜像数据和元数据的持久化存储,确保容器及其依赖能够被可靠加载。 这些分层的设计使得 containerd 可以清晰地分离关注点,提高系统的可维护性和扩展性。 --- #### 2. **containerd 的工作流程** 当用户请求创建一个新的容器时,containerd 将按照以下逻辑完成整个过程: - 首先,containerd 接收到来自用户的指令后,会解析该命令并验证参数合法性。 - 接着,它从本地或者远程仓库拉取所需的容器镜像,并将其解压到指定路径下以便后续使用。 - 创建沙盒环境(即隔离的工作目录),并将必要的配置文件写入其中。 - 利用 `runc` 或其他 OCI 兼容的运行时工具来初始化新进程实例,同时设置好 cgroups 和 namespaces 参数以实现资源限制与系统隔离[^3]。 - 启动成功之后,由专门组件持续跟踪记录此容器状态变化情况并通过事件机制通知外部监听者[^2]。 这一过程中涉及到了多种关键技术的支持,比如 CRI (Container Runtime Interface),这有助于 Kubernetes 更加便捷地集成 containerd;还有就是前面提到过的 shim 技术,则进一步增强了高可用特性——即使 main daemon 出现异常也不会干扰已存在的 instances 正常运作。 --- #### 3. **containerd-shim 的作用** 为了增强稳定性,containerd 引入了一个名为 `containerd-shim` 的中间件程序充当实际 runtime process 的 parent pid 。这样做的好处在于即便主 service 发生崩溃重启等情况 ,子 processes 如 containers 自身依旧保持独立存活不受影响。具体来说: - 当某个具体的 instance 开始运转起来以后 , system 自动生成相应版本号命名格式如 "containerd-shim-v1" 的 helper binary 实例并与之建立父子关系链路连接. - 如果此时顶层 controller crash down,那么操作系统层面仍然保留有 direct link 继续维持 lower level entities' existence. 这种设计理念极大地提升了 robustness 特质,在大规模生产环境中尤为重要。 --- #### 4. **安全性考量** 除了基本功能之外,security aspect 在开发阶段就被赋予极高优先级对待。containerd 支持主流 Linux security frameworks 包括但不限于 SELinux/AppArmor profiles application during setup phase to enforce strict access control rules preventing unauthorized activities inside/outside boundaries defined beforehand.[^4] 此外,image verification mechanisms also play critical roles ensuring only trusted binaries get deployed into production systems thus reducing potential attack surfaces significantly. --- ### 示例代码展示如何简单部署 containerd 并测试其基础功能 以下是基于 Ubuntu 系统安装并验证 containerd 是否正常工作的脚本样例: ```bash #!/bin/bash # Step A: Install prerequisites and configure repository keys sudo apt update && sudo apt install -y curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/containerd-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/containerd-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/containerd.list > /dev/null # Step B: Proceed with installation of the software itself plus essential plugins sudo apt update && sudo apt install -y containerd.io # Optional customization step modifying default config file located at '/etc/containerd/config.toml' sudo mkdir -p /etc/containerd/ containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 # Restart service after any manual edits made above sudo systemctl restart containerd.service # Finally run a sample hello-world image as sanity check ctr images pull docker.io/library/hello-world:latest ctr containers create --name test-container docker.io/library/hello-world:latest ctr tasks start test-container ``` 上述脚本展示了完整的端到端体验,涵盖了从准备环境到最后一步确认一切按预期行为表现出来的全过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值