前言
由于新的 Macbook Pro 用的 M1 芯片的关系,在 M1芯片的 Mac 上创建的 Docker 镜像不能用在 Intel 芯片的 Linux 服务器,所以尝试探索一下创建跨架构镜像的方式,也就是在 ARM64 架构平台上创建 AMD64 架构平台的 Docker 镜像。
关于x86、x64、amd64、arm64
x86,是指32位指令集的CPU架构(并没有x32的说法);
x64,是指64位指令集的CPU架构(AMD公司称amd64,Intel公司称intel64,一般统称x86_64);
amd64,最早由AMD公司公开的64位指令集以扩展x86,AMD公司称amd64;
arm64,由ARM公司所有,后被日本软银收购,Apple M1芯片就是用的arm64架构。
创建/选用构建器
--name,指定构建器实例名称。
--use,创建后自动选用为当前构建器,等效于docker buildx use命令。
docker buildx create --use --name mybuild
检查/启动构建器
--bootstrap,确保在检查构建器之前就已运行;
根据构建器的驱动,如果是docker-container,那么会自动运行一个 buildkit 容器。
docker buildx inspect mybuild --bootstrap
输出示例:
[+] Building 0.7s (1/1) FINISHED
=> [internal] booting buildkit 0.7s
=> => starting container buildx_buildkit_mybuild0 0.7s
Name: mybuild
Driver: docker-container
Nodes:
Name: mybuild0
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
列出构建器
Docker 默认的构建器驱动是docker,通常应自己创建驱动docker-container的构建器。
docker buildx ls
输出示例:
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuild * docker-container
mybuild0 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
构建指定架构镜像
--platform=value[,value],指定目标架构平台,值为os/arch或者os/arch/variant形式,例如linux/amd64,linux/arm64;另外当--platform为local时则使用 BuildKit 所运行的平台。
-o, --output=[PATH,-,type=TYPE[,KEY=VALUE],指定构建结果的导出方式,根据使用构建器的驱动,如果为docker则仅支持type=local,而docker-container则支持全部导出方式(local、tar、oci、docker、image、registry)。
-o type=docker,导出方式为docker,导出支持单一平台的镜像;如果要导出支持多平台的镜像则更多地会使用image或registry方式。
docker buildx build -t jre:8 --platform=linux/amd64 -o type=docker .
参考
[1] Multi-platform images
[2] Load to image store
[3] docker buildx