惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
博客园_首页
博客园 - 【当耐特】
V
Visual Studio Blog
博客园 - 叶小钗
月光博客
月光博客
美团技术团队
J
Java Code Geeks
小众软件
小众软件
Y
Y Combinator Blog
博客园 - Franky
Martin Fowler
Martin Fowler
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周
利用buildx构建支持多CPU架构平台的docker镜像
二丫讲梵 · 2022-05-18 · via 二丫讲梵

准备给开源项目做一个镜像,由于当前使用的是 M1 型号的 Mac 电脑,打出来的镜像无法运行在 AMD 架构之上,但是在 dockerhub 上又见过一些比较大的项目的镜像,支持多平台,因此就了解了一波,本文记录一下实操过程。

在 docker 官方文档中,也有对这块儿内容的讲解,参考: Leverage multi-CPU architecture support (opens new window)

核心点是:Docker 在 19.03 版本引入了构建插件 buildx (opens new window) ,可以很轻松地构建多平台 Docker 镜像。

# 启用 buildx 插件

使用之前确保自己的 docker 版本不低于 19.03,通过如下方式查看自己的 docker 版本:

$ docker -v
Docker version 20.10.13, build a224086

1
2

启用 buildx 插件:

export DOCKER_CLI_EXPERIMENTAL=enabled

1

验证是否开启:

$ docker buildx version
github.com/docker/buildx v0.8.1 5fac64c2c49dae1320f2b51f1a899ca451935554

1
2

使用桌面版的 docker 已经提供 binfmt_misc 多架构支持,这意味着您可以为不同的 Linux 架构运行容器,例如 armmipsppc64le 甚至 s390x,因此不需要再单独配置。

# 从默认的构建器切换到多平台构建器

Docker 默认会使用不支持多 CPU 架构的构建器,我们需要手动切换。

先创建一个新的构建器:

$ docker buildx create --use --name mybuilder

1

然后启动构建器:

$ docker buildx inspect mybuilder --bootstrap
[+] Building 32.6s (1/1) FINISHED
 => [internal] booting buildkit                                                                                                           32.5s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                        31.8s
 => => creating container buildx_buildkit_mybuilder0                                                                                       0.7s
Name:   mybuilder
Driver: docker-container

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6

1
2
3
4
5
6
7
8
9
10
11
12
13

查看当前使用的构建器支持的 CPU 架构:

$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT             STATUS  PLATFORMS
mybuilder *     docker-container
  mybuilder0    unix:///var/run/docker.sock running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux   docker
  desktop-linux desktop-linux               running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default         docker
  default       default                     running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

1
2
3
4
5
6
7
8

申明

原创文章eryajf,未经授权,严禁转载,侵权必究!此乃文中随机水印,敬请读者谅解。

# 基于 Dockerfile 构建

我们准备好项目的 Dockerfile,并做好 dockerhub 的认证,然后开始构建镜像,并直接推送到 dockerhub。

$ docker buildx build -t eryajf/go-ldap-admin --platform=linux/arm64,linux/amd64 . --push

1

此时来到 dockerhub 中看这个镜像,也能看到多平台支持的标识了:

我们也可以通过命令行查看每个镜像的信息:

$ docker buildx imagetools inspect eryajf/go-ldap-admin
Name:      docker.io/eryajf/go-ldap-admin:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:e70c93a079f64bf3b11beb5bb5c3365d521ab150ceaccc5c0318ccc94945aa48

Manifests:
  Name:      docker.io/eryajf/go-ldap-admin:latest@sha256:af9f6c43744850e8430124cfa2a3d7faaa998b31e0db500e8e005d7916e3bec2
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64

  Name:      docker.io/eryajf/go-ldap-admin:latest@sha256:fcf385c734aaf1d7ee9ebc69925f457c6fae5c84df9beffb354b875b0cfc7409
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64

1
2
3
4
5
6
7
8
9
10
11
12
13

当我们在使用并拉取这个镜像的时候,docker 会根据 CPU 架构拉取匹配的镜像。