多架构镜像的构建-docker buildx/docker manifest
简介:企业改造或云原生适配使用等;
自建k8s、配合ECR等。或整个流水线镜像部分;
以下为使用适配大部分环境使用或尝试情况。使用工具均免费开源。加速器等有个人或购买的建议使用个人的;
典型使用场景:
跨平台分发:如同时支持 Intel/AMD 和 ARM 处理器的应用部署。
简化用户操作:用户无需手动指定 --platform 参数,Docker 自动适配

多架构单镜像拉取方法
多架构镜像公网下载方法
1.windows商店安装watt toolkitt软件开启本地加速


2.打开docker hub网站
https://hub.docker.com

3.本地下载所需镜像
以nginx arm64版本为例




docker pull nginx:1.22.1-alpine3.17-slim@sha256:9cddb0a1b84ee590f73bd4d216bb7102fdafcbc7326abd6c49825957d194bdb9
sha256:9cddb0a1b84ee590f73bd4d216bb7102fdafcbc7326abd6c49825957d194bdb9 就是nginx:1.22.1-alpine3.17-slim arm64版本nginx镜像的MANIFEST DIGEST,默认docker 拉取镜像的时候根据docker所在主机自动拉取对应架构的镜像,如果在x86主机拉取arm64镜像,需要指定镜像的MANIFEST DIGEST
以上操作可以获取多种基础单架构镜像。
daemon.json不在详细展示。个人适配即可。
双架构镜像制作
docker manifest 方式
docker manifest create 是 Docker 中用于创建 多架构镜像清单(Manifest List) 的命令,其核心作用是将不同硬件架构的独立镜像合并为一个逻辑上的统一镜像,实现跨平台兼容性。
Manifest List 结构:生成的清单文件(Manifest List)本质是一个 JSON 文件,记录了不同架构镜像的元数据(如哈希值、平台信息等)。此文件本身不包含镜像层数据,仅作为索引。
独立构建多架构镜像:需预先为每个目标平台构建镜像并推送到镜像仓库(如 yourimage:x86 和 yourimage:arm)
启用实验性功能:部分旧版本 Docker 需在配置中启用 experimental 特性
基本语法:
docker manifest create <目标镜像名> <镜像列表>
示例:将 x86 和 arm 架构的镜像合并为 myapp:latest :
docker manifest create myapp:latest myapp:x86 myapp:arm
标识镜像架构----docker manifest annotate
为已创建的 Manifest List 中的镜像条目添加缺失的架构信息(如 --os、--arch、--variant),或覆盖默认值。例如:
docker manifest annotate myapp:latest myapp:arm64 --arch arm64 --os linux
支持更精确的平台定义(如 arm/v7 与 arm/v8 的区别),避免跨平台拉取时因元数据不完整导致错误
使用场景
修正自动生成的清单:若通过 docker manifest create 创建的清单缺少必要元数据(如未自动识别 arm64 架构),需手动补充。
支持特殊变体:如为 arm32v6 和 arm32v7 架构添加差异化的 variant 参数。
多阶段清单管理:在推送 Manifest List 到仓库前,调整其内部镜像的关联属性。
完整操作步骤:
典型操作流程
创建清单:先用 docker manifest create 生成基础清单。
注释元数据:对每个架构镜像执行 annotate,补充必要信息。
推送清单:使用 docker manifest push 发布最终清单到仓库。
验证架构镜像:
docker inspect <镜像名或ID> | grep Architecture

或
docker image inspect bakreg.cn/library/nginx:v1.1 --format='{{.Architecture}}'
虚拟机搭建harbor使用https协议需要增加 --insecure
docker manifest create --insecure
docker manifest push --insecure bakreg.cn/library/nginx:v1.1
harbor仓库搭建可自行搜索,仅借用本地制作多架构镜像。非必要仓库,有其他远程公网或内网仓库可直接复用。
详细步骤及命令
以下IP:Port代指远程仓库或本地仓库
拉取镜像且保证最终需要以下镜像的目标仓库有以下镜像,没有需要上传,否则在manifest create创建多架构镜像时报错
先在本地加载镜像。拉取或自行制作等均可,完成后重新tag标识
docker pull IP:Port/nginx1293:v1-amd64
docker pull IP:Port/nginx1293:v1-arm64
# 为 arm64 架构构建镜像
docker build --platform linux/arm64 --no-cache -t 192.168.177.129:8090/library/nginx:v1 -f Dockerfile-manifest .
# 为 amd64 架构构建镜像
docker build --platform linux/amd64 --no-cache -t nginx:v1 -f Dockerfile-manifest .
目标仓库需要推送--没有manifest create报错,需要推送保证仓库目录及名称存在。
docker push IP:Port/nginx1293:v1-amd64
docker push IP:Port/nginx1293:v1-arm64
docker manifest create --insecure IP:Port/nginx1293:v1 IP:Port/nginx1293:v1-amd64 IP:Port/nginx1293:v1-arm64
docker manifest annotate IP:Port/nginx1293:v1 IP:Port/nginx1293:v1-amd64 --arch amd64
docker manifest annotate IP:Port/nginx1293:v1 IP:Port/nginx1293:v1-arm64 --arch arm64
docker manifest push --insecure IP:Port/nginx1293:v1
docker manifest inspect IP:Port/nginx1293:v1
docker buildx
参考连接:
https://goodcommand.readthedocs.io/zh_CN/latest/command/docker_buildx.html
根据最新版docker 即docker --version 在29.0.0以上可更加简洁使用制作双架构镜像。但推送时需要注意目标仓库版本。可能由于docker版本过高导致OCI等无法推送,需要更换低版本docker推送。
命令如下:
模拟器镜像--docker版本29.0.0以下。--最终push至内网仓库网络会受影响,不做重复说明。可参考:
指定配置文件:--config /etc/buildkit/buildkitd.toml
docker buildx create --driver docker-container --platform linux/arm64,linux/amd64 --config /etc/buildkit/buildkitd.toml --use
docker pull moby/buildkit:buildx-stable-1
#####启用docker buildx-------29.0.0以上docker
# 安装QEMU模拟器
docker run --privileged --rm tonistiigi/binfmt --install all
实验镜像 nginx架构为amd64,arm64
docker pull docker.io/library/nginx:latest --platform linux/amd64
docker tag nginx:latest nginx-amd64
docker pull docker.io/library/nginx:latest --platform linux/arm64
docker tag nginx:latest nginx-arm64
docker tag nginx-amd64:latest localhost/nginx-amd64:v1
docker push localhost/nginx-amd64:v1
docker tag nginx-arm64:latest localhost/nginx-arm64:v1
docker push localhost/nginx-arm64:v1
mkdir ~/demo
cd ~/demo
cat > Dockerfile <<EOF
FROM localhost/nginx-${TARGETARCH}:v1
RUN uname -a > /os.txt
CMD tail -f /os.txt
EOF
docker buildx build -t localhost/nginx:v2 --platform linux/amd64,linux/arm64 --push .
更多推荐
所有评论(0)