基于Docker buildx构建多平台镜像

基于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 builddocker 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

image-20250123111008846

构建多平台镜像

这里我使用是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参数,一次只构建一个平台的镜像

image-20250123111244223

image-20250123111338356

可以看到镜像已经成功的推送到镜像仓库上了,有 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/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇