多平台镜像构建 ¶
近期信创要求 需要使用 arm架构,增加多平台镜像构建。制作支持多种不同 CPU 架构的镜像。
buildx 介绍 ¶
buildx 是一个管理 Docker 构建的 CLI 插件, 底层使用 BuildKit 扩展了 Docker 构建功能。
驱动类型 | 运行方式 | 核心特点 | 适用场景 |
---|---|---|---|
docker | 使用 Docker 守护进程内置的 BuildKit 库,与 Docker 深度集成。 | 无需额外部署,默认模式,配置简单;与 Docker 生命周期绑定。 | 本地开发、单机构建、快速验证场景。 |
docker-container | 通过 Docker 创建独立的 BuildKit 容器,隔离运行构建任务。 | 资源隔离性强,支持多版本 BuildKit 并存;便于升级和故障排查。 | 多环境协作、需要灵活管理 BuildKit 版本的场景。 |
kubernetes | 在 Kubernetes 集群中创建 BuildKit Pod,利用 K8s 调度能力执行构建。 | 支持分布式构建、弹性扩缩容;适配云原生 CI/CD 流程,适合大规模集群环境。 | 云原生应用开发、持续集成 / 持续部署(CI/CD)、高并发构建任务。 |
remote | 直接连接到手动管理的远程 BuildKit 守护进程(需提前部署并暴露接口)。 | 支持跨网络调用,构建任务与开发环境分离;可复用已有远程构建资源。 | 分布式架构、构建资源集中管理、跨团队协作或混合云场景。 |
使用 docker buildx 方式 ¶
安装 docker ¶
curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun
设置 docker 源
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<EOF
{
"ipv6": false,
"proxies": {
"http-proxy": "http://10.1.1.57:8081",
"https-proxy": "http://10.1.1.57:8081"
},
"registry-mirrors": [
"https://hub.docker.linuxnbg.com"
]
}
EOF
重启服务
systemctl daemon-reload
systemctl restart docker
buildx 使用 ¶
由于被墙了、所以使用自定义加速源。
创建自定义构建器 ¶
在使用 Buildx 之前,需要创建一个构建器实例,支持多平台构建且配置了代理的 builder 实例,并将其加载到本地 Docker 守护进程中
创建配置文件设置代理地址 ¶
cat config.toml
debug = true
[registry."docker.io"]
mirrors = ["https://hub.docker.linuxnbg.com"]
创建构建器 ¶
docker buildx create --use --name datarc-builder --config config.toml
一次编译多平台镜像并推送 ¶
编译指定的多平台镜像加载到远端,平台之间需使用逗号隔开,使用 --builder 指定构建器。--push 配合 docker login 推送。
登录华为云 swr 镜像仓库
docker login
编写测试 Dockerfile
# 使用 Python 3.10.17 的 Alpine 版本作为基础镜像
# Alpine 镜像体积小,适合构建轻量级容器
FROM python:3.10.17-alpine
# 设置工作目录
# 后续的操作将在该目录下执行
WORKDIR /app
# 运行 uname -a 命令,并将系统信息输出到 os1.txt 文件
# 使用非交互式 shell 确保命令执行的一致性
RUN uname -a > /app/os.txt
# 容器启动时执行的命令
# 查看 os1.txt 文件中的系统信息
CMD ["cat", "/app/os.txt"]
构建并推送至远程仓库
docker buildx build --platform linux/amd64,linux/arm64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v1 --push . --builder datarc-builder --provenance=false --sbom=false
查看远程仓库已经推送成功 | 查看有两种架构 |
---|---|
![]() |
![]() |
本地测试
docker run -it --rm --name test_container swr.cn-east-3.myhuaweicloud.com/china/apline-test:v1
X86 效果 | arm 效果 |
---|---|
![]() |
![]() |
通过镜像名区分平台 ¶
amd64
架构构建镜像:
docker buildx build --platform linux/amd64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64 --load --builder datarc-builder . --provenance=false --sbom=false
arm64
架构构建镜像:
docker buildx build --platform linux/arm64 -t swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64 --load --builder datarc-builder . --provenance=false --sbom=false
推送到仓库:
docker push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64
docker push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64
创建 manifest:
docker manifest create swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2 swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-amd64 swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2-arm64 --amend
推送 manifest
docker manifest push swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
查看远程仓库已经推送成功 | 查看有两种架构 |
---|---|
![]() |
![]() |
docker pull swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
docker images |grep v2
docker inspect --format='{{.Architecture}}' swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
docker run -it --rm --name test_container swr.cn-east-3.myhuaweicloud.com/china/apline-test:v2
X86 效果 | arm 效果 |
---|---|
![]() |
![]() |
查看镜像信息
docker buildx imagetools inspect [docker images name:tag]
https://github.com/docker/buildx/issues/59
https://github.com/docker/buildx/issues/59#issuecomment-2612971318