基于Docker buildx构建多平台镜像
前言
之前一直使用docker manifest
合并多平台镜像,使用教程可参考:https://199604.com/3169
但docker manifest
不支持构建,因此不满足自行构建多平台镜像。于是只能通过docker buildx
进行构建,再加上年前没啥活,就学习记录一下过程。
Docker buildx 是什么?
Docker buildx 是 Docker 官方维护的一个 CLI 插件,它基于 BuildKit 引擎,提供了不同于 docker build 的更多功能,
buildx的一个关键特性是可以同时为不同的硬件架构构建并输出镜像,使得我们可以很容易地交叉构建镜像。比如,我们可以在 AMD64 的机器上构建 ARM64 架构的镜像,这对于软件的跨平台支持非常有用。
Docker buildx 支持的平台主要包括以下几种:
- Linux:包括多种 CPU 架构和操作系统,如 x86_64、ARM、IBM Power、IBM Z 等。
- Windows:包括多种 CPU 架构和操作系统,如 x86_64、ARM64 等。
- macOS:支持 Intel、Apple M1 架构。
docker manifest
vs docker buildx
特性 | docker manifest |
docker buildx |
---|---|---|
主要用途 | 管理和分发多平台镜像 | 构建多平台镜像 |
功能重点 | 镜像清单操作(创建、修改、推送) | 高效构建和分布式构建 |
是否支持构建 | 不直接支持构建,依赖 docker build 或 docker buildx |
支持完整的构建流程 |
是否支持多平台 | 是,通过聚合不同架构的镜像 | 是,直接在构建时支持多平台 |
是否支持分布式构建 | 不支持 | 支持,通过 BuildKit |
是否支持缓存优化 | 不支持 | 支持,通过 BuildKit |
docker manifest
主要用于管理和分发多平台镜像,适合在镜像构建完成后对镜像清单进行操作。docker buildx
是一个强大的构建工具,支持多平台构建、分布式构建和缓存优化,适合在构建过程中直接生成多平台镜像。
配置 Docker buildx 环境
# Docker 版本不低于 19.03,才能使用 buildx
docker info
# 检查 buildx 插件
docker buildx version
# 查看是否开启 experimental 功能
# --platform 参数需要 experimental 为 true,通过下面的命令可以验证是否开启:
docker info | grep -i 'experimental'
# 开启experimental 功能配置:
# 参考:https://199604.com/2865
# 修改配置
vi /etc/docker/daemon.json
# 新增
"experimental": true
# 重新加载服务的配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker
如果我们使用的 Docker 版本中没有包含 buildx,或者想要安装最新版本的 buildx,可以访问 buildx 获取安装指南。
安装 buildx 插件 – 已安装可忽略
# 目前使用环境为linux amd,如其他环境可自行选择下载
wget https://github.com/docker/buildx/releases/download/v0.19.3/buildx-v0.19.3.linux-amd64
chmod a+x buildx-v0.19.3.linux-amd64
mkdir -p /usr/libexec/docker/cli-plugins
mv buildx-v0.19.3.linux-amd64 /usr/libexec/docker/cli-plugins/docker-buildx
Buildx 构建演示
以下是一个简单的 Dockerfile 示例,用于创建一个非常小的镜像,并测试 docker buildx
对 ARM 和 x86 平台的支持。这个 Dockerfile 使用了 Alpine Linux 作为基础镜像,并在其中安装了 echo
命令,用于测试。
Dockerfile 示例
# 使用 Alpine Linux 作为基础镜像
FROM alpine:latest
# 安装 echo 命令(Alpine 默认包含 echo,这里只是为了演示)
RUN apk add --no-cache echo
# 设置默认命令
CMD ["echo", "Hello from Docker Buildx!"]
配置Buildx的镜像加速配置文件
因为buildx
的环境跟docker不一样的,docker配置了镜像加速,但是buildx
没配置一样也无法进行拉取,因此需要配置镜像加速器,否则你会发现直接docker pull
可以正常用,但是docker bulidx
还是无法拉取,这个问题也是折腾我半天才发现。
# 创建文件夹
mkdir -p /root/conf/
# 新建镜像加速器buildkitd.toml文件
vim /root/conf/buildkitd.toml
# 内容如下:
# 启用调试日志
debug = true
# 配置镜像加速
[registry."docker.io"]
mirrors = ["docker.1panel.live","registry-1.docker.io"]
http = false
# 配置私有仓库(Harbor)
[registry."reg-hub.gzeport.com"]
http = true
insecure = true
#http = false # 如果是 HTTPS,设置为 false
#insecure = true # 如果证书不可信,设置为 true
#ca = ["/path/to/your/ca.crt"] # 如果有自签名证书,指定 CA 文件路径
参考:
https://docs.docker.com/build/buildkit/toml-configuration/
创建一个Buildx 构建实例
buildx 有一个默认的 builder,但是这个builder不支持多平台构建。因此,我们需要创建一个支持多平台构建的 builder 实例。
1、查看 builder
docker buildx ls
2、创建一个支持多平台构建的 builder 实例,并切换到新的builder
docker buildx create --use --name=glj --driver docker-container --driver-opt network=host --config /root/conf/buildkitd.toml
注意:使用docker-container driver才支持多平台构建。
3、查看 builder 详情并初始化
docker buildx inspect --bootstrap
4、切换builder
docker buildx use default
docker buildx use glj
5、查看builder详情
docker buildx inspect glj
构建多平台镜像
这里我使用是harbor私有的容器仓库作为镜像的存放仓库
# 登录容器仓库
docker login gzeport reg-hub.gzeport.com
# 构建镜像并推送镜像仓库,这里同时构建 x86 和 arm 的镜像
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t reg-hub.gzeport.com/ywb/buildximages:latest --push .
# docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t reg-hub.gzeport.com/ywb/buildximages:latest .
# 出现警告:WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use –push or to load image into docker use –load
# 这个命令将会为 amd64、arm64 和 arm/v7 架构构建镜像,但是,构建后的镜像通过 docker images 是看不到的,只会存在BuildKit 的构建缓存中,也就是说-t参数是无效的。
# 想要看到构建出的镜像,有两个办法:
# 方法一:使用--push参数直接上传到镜像仓库
# 方法二:使用--load参数,一次只构建一个平台的镜像
可以看到镜像已经成功的推送到镜像仓库上了,有 arm 和 x86 镜像,至于还有unknown的,我这边暂时也还不清楚怎么回事,但正常进行拉取使用。
最后
构建出的镜像,确保可用的话,可以使用像 QEMU 这样的模拟器,或者实际的硬件设备来测试构建的容器镜像。可参考:https://199604.com/3000
进行配置qemu-user-static依赖
参考
1.https://www.voidking.com/dev-docker-buildx/
2.https://docs.docker.com/build/buildkit/toml-configuration/