Docker镜像构建器

2026-02-26 20:51:00
丁国栋
原创 9
摘要:本文记录和汇总关于Docker镜像构建器的一些知识和常用命令。

在腾讯云上的容器镜像服务中,容器镜像的制品类型有Docker-Image和OCI-Image-List-v1之分。而Docker-Image可以被扫描检查其漏洞情况,OCI-Image-List-v1不能被扫描。

在本地构建Docker镜像推送后发现默认是OCI-Image-List-v1而不是Docker-Image,后来咨询腾讯云技术团队才知道这里面的奥秘。


Docker 镜像格式与构建器管理笔记

一、镜像格式对比

1. Docker 镜像 (Docker-Image)

  • 格式标识: application/vnd.docker.distribution.manifest.v2+json
  • 特点:
    • 单平台架构 (如 linux/amd64)
    • 传统 Docker 格式,兼容性好
    • 适用于单一目标环境
  • 典型生成场景: docker build 默认输出

2. OCI 镜像列表 (OCI-Image-List-v1)

  • 格式标识: application/vnd.oci.image.index.v1+json
  • 特点:
    • 多平台镜像索引 (包含多个子清单)
    • 遵循 OCI 开放标准
    • 支持跨平台自适应拉取
  • 典型生成场景: docker buildx build --platform 指定多平台时

二、控制生成镜像格式的方法

1. 生成 Docker 镜像的确保措施

# 方法A: 传统 docker build (默认生成 Docker 镜像)
docker build -t myimage:latest .
# 方法B: 明确指定单平台
docker build --platform linux/amd64 -t myimage:latest .
# 方法C: 使用 Buildx 但强制 Docker 驱动
docker buildx create --name docker-driver --driver docker --use
docker buildx build -t myimage:latest --load .

2. 生成 OCI 镜像列表的场景

# 多平台构建自动生成 OCI 索引
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest --push .

3. 格式验证命令

# 查看镜像清单类型
docker manifest inspect myimage:latest | grep "mediaType"
# 查看镜像架构信息
docker inspect myimage:latest --format '{{.Os}}/{{.Architecture}}'

三、Buildx 构建器管理

1. 构建器查询命令

# 查看所有构建器 (星号 * 标记当前默认)
docker buildx ls
# 查看当前构建器详情
docker buildx inspect
# 查看指定构建器
docker buildx inspect <构建器名称>

2. 构建器创建与切换

# 创建 Docker 驱动构建器 (生成 Docker 镜像)
docker buildx create --name mybuilder --driver docker
docker buildx create --name mybuilderx --driver docker-container
# 切换到指定构建器
docker buildx use mybuilderx
# 创建并立即切换到新构建器
docker buildx create --name mybuilder --driver docker --use
docker buildx create --name mybuilderx --driver docker-container --use

3. 构建器驱动类型对比

驱动类型 平台支持 输出格式 适用场景
docker 单平台 Docker 镜像(Docker-Image) 传统构建,兼容性要求高
docker-container (默认) 多平台 OCI 镜像列表(OCI-Image-List-v1) 跨平台构建,现代化 CI/CD

4. 构建器生命周期管理

# 删除构建器
docker buildx rm <构建器名称>
# 重置为默认构建器
docker buildx use default

四、场景化配置方案

场景 1: 本地开发 (需要 Docker 镜像)

# 创建并切换到 Docker 驱动构建器
docker buildx create --name local-dev --driver docker --use
# 构建单平台镜像
docker buildx build -t app:dev --load .
# 验证格式
docker manifest inspect app:dev | grep "mediaType"
# 预期输出: "application/vnd.docker.distribution.manifest.v2+json"

场景 2: 生产多平台发布 (需要 OCI 镜像列表)

# 使用默认构建器 (docker-container 驱动)
docker buildx use default
# 构建并推送多平台镜像
docker buildx build --platform linux/amd64,linux/arm64 \
                    -t myregistry/app:latest \
                    --push .

场景 3: 格式转换 (OCI → Docker)

# 拉取特定平台的镜像
docker pull myimage:latest --platform linux/amd64
# 重新标记为单平台镜像
docker tag <镜像ID> myimage-single:latest

五、关键检查点总结

检查项目 Docker 镜像 OCI 镜像列表
媒体类型 application/vnd.docker... application/vnd.oci.image.index...
平台数量 单一平台 多平台索引
构建命令 docker build 或单平台构建 docker buildx build --platform 多平台
构建器驱动 docker 驱动 docker-container 驱动
输出动作 --load 到本地 --push 到仓库

六、最佳实践建议

  1. 明确需求再选择格式:

    • 单一环境部署 → Docker 镜像
    • 多架构集群部署 → OCI 镜像列表
  2. 构建器环境隔离:

    # 为不同项目创建独立构建器
    docker buildx create --name project-a --driver docker
    docker buildx create --name project-b --driver docker-container
  3. 版本兼容性检查:

    • Docker 23.0+ 默认使用 Buildx 后端
    • 旧版工具链需确保使用 Docker 镜像格式
  4. CI/CD 配置:

    • 明确指定构建器驱动类型
    • 根据目标环境选择输出格式
    • 添加镜像格式验证步骤

七、常用命令速查

# 镜像格式诊断
docker manifest inspect <镜像>:<标签>
# 构建器状态管理
docker buildx ls                    # 列表
docker buildx use <名称>           # 切换
docker buildx rm <名称>            # 删除
# 构建控制
docker buildx build --load         # 生成 Docker 镜像到本地
docker buildx build --push         # 推送镜像 (可能生成 OCI 列表)
docker buildx build --platform ... # 指定平台 (多平台时生成 OCI)

总结: Docker 镜像适用于单架构场景,OCI 镜像列表用于多平台分发。通过 docker buildx 构建器管理和平台参数控制,可精确控制输出格式。实际使用中应根据部署需求选择合适的格式和构建策略。

发表评论
博客分类