构建多种系统架构支持的镜像
想要构建多平台的镜像,有两种方式可以考虑:
- 在不同的架构系统上分别构建自己的镜像并上传 (不同名称的镜像名不能一样,否则会覆盖)
- 基于Docker提供的buildx工具,在任意架构平台的系统上,一次性构建并上传多平台镜像
第一种就不说了,因为它并不方便,也不实用,而且也麻烦
事实上,只要你稍微关注Docker Hub,就会发现基本上主流的镜像,都是支持多架构的.
如上图所示, JDK的Docker同一个镜像支持非常多不同的平台.
新建 builder
实例
Docker for Linux 不支持构建 arm
架构镜像,我们可以运行一个新的容器让其支持该特性
创建一个多架构的构建实例
buildx默认使用的是docker
驱动,这个是不支持多平台构建的.所以我们需要切换使用docker-container
驱动,这个驱动是特别支持多平台构建的
docker buildx create --use \
--name multi-arch-builder \
--driver docker-container \
--platform linux/amd64,linux/arm64 \
--buildkitd-flags "--oci-worker-net=cni" \
--buildkitd-flags '--allow-insecure-entitlement security.insecure' \
--driver-opt image=moby/buildkit:buildx-stable-1
构建镜像
新建 Dockerfile 文件
# syntax=docker-registry.local.liaosirui.com:5000/third/docker.io/docker/dockerfile:1.4.3
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
CMD cat /os.txt
使用这个实例进行构建
docker buildx build \
--platform linux/amd64,linux/arm64 \
--file ./build/docker/Dockerfile \
--progress plain \
--pull \
--push \
-t docker-registry.local.liaosirui.com:5000/test/alpine:master_latest \
.
--push
参数表示将构建好的镜像推送到仓库
在不同架构运行该镜像,可以得到该架构的信息
# arm64
> docker pull --platform arm64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
> docker run -it --rm docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 aarch64 Linux
# arm64 可以使用
# docker create --name test-arm64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
# docker cp test-arm64:/os.txt ./os.txt
# cat ./os.txt
# Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 aarch64 Linux
# amd64
> docker pull --platform amd64 docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
> docker run -it --rm docker-registry.local.liaosirui.com:5000/test/alpine:master_latest
Linux buildkitsandbox 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 x86_64 Linux