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
?? 關鍵配置注意事項
-
?鏡像倉庫認證?
編輯/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。 -
?cgroup 驅動?
若使用 systemd cgroup,需在config.toml中啟用:[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] systemd_cgroup = true -
?多階段構建優化?
-
通過分階段構建減少鏡像體積(與 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 使用。
時間是個偉大的作者,必將給出完美的答案。

浙公網安備 33010602011771號