Docker buildx 跨架构镜像打包教程
在现代软件开发中,常常需要在一种架构(如 x86_64 / amd64)上为另一种架构(如 arm64)构建应用。Docker 的 buildx 工具集成了 QEMU 模拟器,支持跨架构构建镜像。本文将简要介绍如何设置、配置并使用 buildx 实现跨架构构建。
前提条件
1、安装 Docker
确保你已安装了较新版本的 Docker Engine 或 Docker Desktop (v19.03+)。buildx 已默认集成在这些版本中。
2、配置网络代理 (可选)
如果网络访问不了dockerhub,则需要开网络代理
开启代理软件的局域网共享
开启“允许来自局域网的连接”或类似名称(如 “Allow LAN”)的选项。
在终端设置环境变量
在执行 docker buildx 命令的终端窗口中,设置临时的环境变量。这样 Docker 就会自动使用这些代理设置。(注意 : 这种方式设置的环境变量只在当前的终端窗口生效。)
-
在 Windows (CMD) 中:
你需要将 <host> 替换为你电脑的局域网 IP 地址(例如 192.168.1.10),将 <VPN Port> 替换为代理软件的端口号(通常是 7890)。
set HTTP_PROXY=http://<host>:<VPN Port>
set HTTPS_PROXY=http://<host>:<VPN Port># 示例
set HTTP_PROXY=http://10.19.153.94:7890
set HTTPS_PROXY=http://10.19.153.94:789 -
在 Linux 或 macOS 中:
export HTTP_PROXY=http://<host>:<VPN Port>
export HTTPS_PROXY=http://<host>:<VPN Port># 示例
export HTTP_PROXY=http://10.19.153.94:7890
export HTTPS_PROXY=http://10.19.153.94:7890
开始打包
1、创建和切换到新的 Builder
buildx 使用 “Builder” 实例来执行构建任务。默认的 builder 不支持多平台构建,所以我们需要创建一个新的。
# 强烈建议再绑一次代理,即使用第二条命令
# 如果你已经在终端设置了环境变量,通常无需再使用 –driver-opt
docker buildx create –use –name mybuilder
# 或者,你也可以使用 –driver-opt 将代理绑定到 builder
docker buildx create –use –name mybuilder –driver-opt env.http_proxy=<你的代理IP>:<端口> –driver-opt env.https_proxy=<你的代理IP>:<端口>
命令解释:
docker buildx create –use –name <builder_name> [options]
- -use: 创建后立即切换到这个新的 builder。
- -name <builder_name>: builder 名字,例如 mybuilder。
- -driver-opt: 设置驱动选项。这是另一种配置代理的方式,会将代理设置永久绑定到这个 builder 实例上。
- env.http_proxy=<IP>:<PORT>: 设置 HTTP 代理。
- env.https_proxy=<IP>:<PORT>: 设置 HTTPS 代理。
检查 Builder 状态 : 确保新的 builder 已经创建并处于活动状态。
docker buildx ls
可以看到mybuilder 旁边有一个星号 *,表示它正在被使用。输出应该会列出它支持的所有平台,如 linux/amd64, linux/arm64, linux/arm/v7 等。
2、构建跨架构镜像
现在已经有了一个支持多平台的 builder,可以开始构建镜像了。
docker buildx build \\
–platform linux/arm64 \\
-t <你的镜像名>:<标签> \\
-o type=docker,dest=<输出文件名>.tar \\
.
# example
docker buildx build \\
–platform linux/arm64 \\
-t similarity_api_service:latest \\
-o type=docker,dest=rerank_api_arm64.tar \\
.
执行此命令后,buildx 会在后台模拟 arm64 环境来执行 Dockerfile 中的所有指令;完成后,会在当前目录下生成一个名为 <输出文件名>.tar 的文件,我的是 rerank_api_arm64.tar 。
命令解释:
docker buildx build –platform <target_platform> -t <image_name>:<tag> -o <output_options> <build_context>
- -platform <target_platform>: 核心参数 。指定你想要构建的目标平台。可以是单个平台(如 linux/arm64),也可以是多个平台(如 linux/amd64,linux/arm64)。
- t <image_name>:<tag>: 为你的镜像指定一个名称和标签,例如 my-app:1.0-arm64。
- o, –output <output_options>: 指定构建产物的输出方式。这是一个非常重要的参数。
- type=docker: 将构建的镜像保存为一个符合 Docker 格式的 .tar 文件。
- dest=<filename>.tar: 指定输出的 .tar 文件名。
- <build_context>: Dockerfile 所在的路径,通常是 . (当前目录)。
使用打包好的镜像
现在你已经有了一个 arm64 架构的镜像压缩包,你可以把它拷贝到任何 arm64 架构的机器上(比如一台装有 Docker 的树莓派或 AWS Graviton 服务器)并加载使用。
docker load -i rerank_api_arm64.tar
# 查看镜像列表
docker images
# 检查镜像架构
docker image inspect similarity_api_service:latest | grep Architecture
# 输出为: "Architecture": "arm64"
评论前必须登录!
注册