Containerd的镜像如何构建?

containerd 本身不包含镜像构建功能,需要借助外部工具来实现。构建 containerd 镜像的主要方法如下:

🔧 1. 使用 BuildKit (推荐)

BuildKit 是专为高效构建容器镜像设计的工具链,已成为 containerd 生态的标准方案。

  • 架构‌buildctl 作为客户端,buildkitd 作为守护进程,支持 runc 或 containerd 作为后端运行容器。
  • 部署‌
  •  
    # 下载并解压 BuildKit 二进制包 wget https://github.com/moby/buildkit/releases/download/v0.12.0/buildkit-v0.12.0.linux-amd64.tar.gz tar -C /usr/local/bin -xzvf buildkit-v0.12.0.linux-amd64.tar.gz # 配置 systemd 服务(示例) cp /usr/local/bin/buildkitd /usr/local/bin/ cat > /etc/systemd/system/buildkit.service <<EOF [Unit] Description=BuildKit Requires=buildkit.socket [Service] ExecStart=/usr/local/bin/buildkitd --addr fd:// [Install] WantedBy=multi-user.target EOF systemctl enable --now buildkit
  • ‌构建镜像‌:
     
    buildctl build --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/username/image:tag,push=true

2. 使用 nerdctl

nerdctl 是兼容 Docker CLI 的 containerd 管理工具,内部调用 BuildKit:

 
# 安装 nerdctl wget https://github.com/containerd/nerdctl/releases/download/v1.0.0/nerdctl-1.0.0-linux-amd64.tar.gz tar -C /usr/local/bin -xzvf nerdctl-1.0.0-linux-amd64.tar.gz # 构建镜像 (自动调用 buildkitd) nerdctl build -t your-image:tag .

 

3. 通过 ctr 命令导入现有镜像

若已有 OCI 格式镜像文件,可直接导入 containerd:

 

# 导出 Docker 镜像为 OCI 格式 docker save your-image:tag | docker run -i --rm quay.io/skopeo/stable copy docker-archive:/dev/stdin oci:your-image-oci # 导入到 containerd ctr image import your-image-oci

 


⚙️ 关键配置注意事项

  1. ‌镜像仓库认证‌
    编辑 /etc/containerd/config.toml,配置私有仓库 TLS 证书:

     
    [plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d"

    在 /etc/containerd/certs.d/your-registry.example 目录放置 hosts.toml 定义认证信息 19。

  2. ‌cgroup 驱动‌
    若使用 systemd cgroup,需在 config.toml 中启用:

     
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] systemd_cgroup = true
     
  3. ‌多阶段构建优化‌

  • 通过分阶段构建减少镜像体积(与 Dockerfile 语法兼容):

     
  • # 构建阶段
  • FROM golang:1.19 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp .

    # 运行阶段
    FROM alpine:latest
    COPY --from=builder /app/myapp /usr/local/bin/
    CMD ["myapp"]


💎 方案对比

‌工具‌‌适用场景‌‌优势‌
BuildKit 生产环境、CI/CD 流水线 高效缓存、并行构建、安全沙箱
nerdctl 开发者迁移 Docker 工作流 兼容 Docker 命令,降低学习成本
ctr 导入 镜像迁移或离线部署 快速导入现有镜像,无需重新构建

💡 ‌建议‌:新项目优先采用 BuildKit + 多阶段构建,兼顾效率与安全性;若需兼容 Docker 命令,则搭配 nerdctl 使用。

 

 

posted @ 2025-07-01 10:58  david_cloud  阅读(326)  评论(0)    收藏  举报