Docker 开启 buildx 多CPU架构镜像制作
Posted 天上的西红柿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 开启 buildx 多CPU架构镜像制作相关的知识,希望对你有一定的参考价值。
Docker开启buildx多CPU架构镜像制作
buildx简介
buildx 可用于在单个平台上实现跨 CPU 架构编译。
buildx 的实现依赖 QEMU (某开源模拟器),支持多种 CPU 架构,如 ARM、Power-PC 和 RISC-V。
需要注意:buildx推送镜像时,不会走主机的hosts文件,默认使用https协议
关于QEMU
QEMU 可以模拟一个完整的操作系统(开销较大)。QEMU还有一种用户态模式,基于 binfmt_misc 模拟目标硬件的用户空间,该模式可以创建轻量级的虚拟机(chroot 或者 容器),通过该方式提供多种平台的虚拟机,然后基于Dockerfile进行编译,平台不通,但Dockerfile是同一份。
系统限制
- Linux 内核v4.8及更高
- Docker v19.03及更高
查看Linux内核版本
$ uname -rs
Linux 5.4.219-1.el7.elrepo.x86_64
查看Docker版本
$ docker verson
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker开启实验特性
vim /etc/docker/daemon.json
# 添加以下内容
"experimental": true
启用 binfmt_misc 来运行非本地架构 Docker 镜像
$ docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
检查 QEMU 处理程序来验证 binfmt_misc 设置是否正确
$ ls -al /proc/sys/fs/binfmt_misc/
total 0
drwxr-xr-x. 2 root root 0 Oct 24 15:33 .
dr-xr-xr-x. 1 root root 0 Oct 24 15:29 ..
-rw-r--r--. 1 root root 0 Oct 24 16:38 qemu-aarch64
-rw-r--r--. 1 root root 0 Oct 24 16:38 qemu-arm
-rw-r--r--. 1 root root 0 Oct 24 16:38 qemu-ppc64le
-rw-r--r--. 1 root root 0 Oct 24 16:38 qemu-s390x
--w-------. 1 root root 0 Oct 24 15:33 register
-rw-r--r--. 1 root root 0 Oct 24 15:33 status
创建并启用 Docker 多架构构建器
# 创建构建器
$ docker buildx create --use --name builderx
# 启动构建器
$ docker buildx inspect builderx --bootstrap
# 查看构建器
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
builderx * docker-container
builderx0 unix:///var/run/docker.sock running v0.10.5 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default docker
default default running 20.10.18 linux/amd64, linux/386, linux/arm64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
常用语法
# 创建构建器
$ docker buildx create --use --name <builder_name> --driver <docker_driver> --config <config_toml>
# 创建镜像
$ docker buildx build --platform linux/amd64,linux/arm64 -t REPOSITORY:TAG -f <Dockerfile> . <option>
# 其中,常用option有
--push:会将构建好的镜像推送到镜像仓库
--load:会将构建好的镜像 load 到本地,不支持 load 多架构镜像,需要分开构建
使用 docker buildx 构建多 CPU 架构镜像
在工作中,遇到了需要将应用程序打包成 Docker 镜像并同时运行在不同的 CPU 架构(X86 和 ARM)的环境中。
ARM 架构与 X86 相比,ARM 低功耗、移动市场占比高,X86 高性能、服务器市场占比高。
不同的 CPU 架构,对于运行相同的应用程序的 Docker 容器,需要分别在相应的 CPU 架构下编译的 Docker 镜像。
要构建多架构镜像,首先想到的是每种 CPU 架构环境(物理环境或虚拟环境)下构建相应的镜像。
但目前 docker 构建环境是 X86 的,没有 ARM 环境,
或者要申请 ARM 物理机,或者要申请/创建 ARM 虚拟机,或者交叉编辑等等,听上去都比较麻烦。
经过研究,发现 docker buildx 支持构建多架构镜像,这使得构建多架构镜像变得简单。
这样就可以在 X86 架构下构建 ARM 架构的镜像。
接下来,开始实践之旅吧。
环境
-
Docker Desktop(Mac)
-
Docker Engine 19.03+
实践步骤
第一步,开启 docker buildx
docker buildx 目前还是试验功能,默认没有开启,需要在 Docker Desktop 的首选项中开启它
Docker —>Preferences —>Command Line —> Enable experimental features
执行 docker buildx 命令,输出截图如下:
第二步,构建多架构镜像,并推送到 Docker Hub
写个简单的 Dockerfile,仅做演示:
echo "FROM python:3.7-alpine”百事2注册:www.baihuayl7.cn >Dockerfile
列出 builder:
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default * docker
default default running linux/amd64, linux/arm64, linux/ppc64le,www.baishenjzc.cn linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
我们当前使用的是默认的 builder,它基本上是旧的 builder。
让我们创建一个新的 builder,它使我们能够访问一些新的多架构结构功能。
创建 builder:
$ docker buildx create www.jintianxuesha.com--use --name mybuilder
mybuilder
查看 builder:
$ docker buildx inspect --bootstrap
[+] Building 18.8s (1/1) FINISHED
=> [internal] booting buildkit 18.8s
=> => pulling image moby/buildkit:buildx-stable-1 18.0s
=> => creating container buildx_buildkit_mybuilder0 0.7s
Name: mybuilder
Driver: docker-container
Nodes:
Name: mybuilder0
Endpoint: unix: /www.lanboyulezc.cn //var/run/docker.sock
Status: running
Platforms: linux/amd64, www.yixingylzc.cn linux/arm64, linux/ppc64le, www.dafengyulept.com linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
构建多架构镜像,并推送到 Docker Hub:
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t donhui/multiarch --push .
该 --platform 标志指示 buildx 要为 Intel 64位、Arm 32位和 Arm 64位架构生成 Linux 镜像。
该 --push 标志生成一个多架构清单,并将所有镜像推送到 Docker Hub。
在 DockerHub 查看该镜像,latest tag 下有三个镜像,当在不同的架构 pull 该 tag 时会根据其环境 pull 相应架构的镜像:
思考与总结
实践中不断产生疑问,不断思考,不断求解,或许你也会有同样的问题:
1、多架构镜像对 docker 版本有何要求?
构建时要用到 docker buildx 命令,docker 版本需要 19.03+;
运行时 docker 版本不一定需要 19.03+,笔者使用 1.13.1 和 18.06.1 都可以 pull 多架构镜像的。
2、所有 Dockerfile 都可以构建成多架构吗?还是有什么要求?
对 Dockerfile 没有要求,任何 Dockerfile 无需修改。
3、镜像构建后默认保存在构建缓存中,如何将镜像保存在本地?
可以将 type 指定为 docker,但必须分别为不同的 恒煊2注册:www.hengxuangyul.com 架构构建不同的镜像,不能合并成一个镜像,如:
docker buildx build -t donghui/multiarch-armv7 --platform=linux/arm/v7 -o type=docker .
docker buildx build -t donghui/multiarch-arm64 --platform=linux/arm64 -o type=docker .
docker buildx build -t donghui/multiarch-amd64 --platform=linux/amd64 -o type=docker .
也可以将镜像 push 到镜像仓库后,再进行 pull。
4、只支持推送到 Docker Hub 吗?如果要推送到私有镜像仓库,对私有镜像仓库有什么要求?
也可以将镜像推送到私有镜像仓库,但需要该镜像仓库支持多架构镜像的功能。
如果要将多架构镜像推送到 Harbor,需要 Harbor 的版本为 v2.0.0。
Harbor v2.0.0 于 2020/05/13 发布,Harbor v2.0.0 完全支持多架构镜像。
Harbor v2.0.0 更新日志:https://github.com/goharbor/harbor/releases/tag/v2.0.0
参考
Container 爱上ARM
https://www.jianshu.com/p/64f0da7a044d
跨平台构建 Docker 镜像新姿势,x86、arm 一把梭
https://blog.csdn.net/alex_yangchuansheng/article/details/103146303
Getting started with Docker for Arm on Linux
https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/
Multi-arch build and images, the simple way
http://www.jintianxuesha.com/?id=605
Building multi-platform images www.sdcqmm.cn
www.0371xzrmyy.com
https://www.shbkrcxzz.cn /?id=605 /docker/buildx#building-multi-platform-images
Building Multi-Arch Images for Arm and x86 with Docker Desktop
https://www.docker.com/blog/multi-arch-images/
以上是关于Docker 开启 buildx 多CPU架构镜像制作的主要内容,如果未能解决你的问题,请参考以下文章