46. docker buildx

image 构建工具,用于构建多种架构的镜像

46.1. 安装buildx

46.1.1. 开启实验室特性

docker客户端

user1@intel6248:~$ cat ~/.docker/config.json
{
"experimental": "enabled"
}

docker 服务端

user1@intel6248:~$ cat /etc/docker/daemon.json
{
"experimental": true
}

systemctl daemon-reload
systemctl restart docker

确认配置成功, Experimental: true

docker version

46.1.2. 安装 docker buildx

如果是 19.03.8, 安装完docker之后就包含了。

如果没有可以直接下载二进制 [3] , 并放到指定目录

mkdir -p ~/.docker/cli-plugins
mv buildx ~/.docker/cli-plugins/docker-buildx

确认安装成功

docker buildx ls
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap

46.1.3. 安装模拟器

如果上面的步骤没有显示多种平台的支持,那么就需要安装模拟器,现在dockers 官方文档只说明了, buildx会包含再docker destop for MAC & windows默认包含buildx, 对于community 版本, 我参考这两篇文章进行设置 [1] [2]

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

最简单的办法就是

docker run --rm --privileged docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64

其中tag可以到这里查询最新的。 [4]

46.2. build多平台image

这里我使用了来自 [2] 的hello.c [5]

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push -t lixianfadocker/hello .

46.3. 运行多平台image

运行命令

docker run --rm --name hello lixianfadocker/hello

在X86上的运行输出是

user1@intel6248:~/Dockerfile_kunpeng/Dockerfile_multi_arch$ docker run --rm --name hello lixianfadocker/hello

Status: Downloaded newer image for lixianfadocker/hello:latest
Hello, my architecture is Linux buildkitsandbox 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 Linux

在Kunpeng920上的运行输出是

user1@Arm64-server:~$ docker run --rm --name hello lixianfadocker/hello

Status: Downloaded newer image for lixianfadocker/hello:latest
Hello, my architecture is Linux buildkitsandbox 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 aarch64 Linux

46.4. 使用build farm

在单台设备上使用build farm的问题是,用模拟指令的方式, 会非常慢。

# 创建一个上下文环境
docker context create --docker "host=ssh://user1@192.168.1.203" intel6248

# assuming contexts node-amd64 and node-arm64 exist in "docker context ls"
$ docker buildx create --use --name mybuild node-amd64
mybuild
$ docker buildx create --append --name mybuild node-arm64
$ docker buildx build --platform linux/amd64,linux/arm64 .

创建

[1]https://jite.eu/2019/10/3/multi-arch-docker/
[2](1, 2) https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/getting-started-with-docker-for-arm-on-linux
[3]https://github.com/docker/buildx/releases
[4]https://hub.docker.com/r/docker/binfmt/tags?page=1&ordering=last_updated
[5]https://github.com/LyleLee/Dockerfile_kunpeng/tree/master/Dockerfile_multi_arch