一台docker机器如何实现构建多平台镜像

1.实现方式

想在 x86_64/amd64 的一台机器平台上,构建适用于多个平台的镜像,例如 linux/amd64、linux/arm64,根据官方文档,有三种方法可以使用:

QEMU

  使用 QEMU 模拟构建多平台映像是最简单的入门方法,但可能比本机构建慢得多,特别是对于编译、压缩或解压缩等计算量大的任务。因此如果条件允许的话,更推荐使用 Cross-compilation(交叉编译)。

Multiple native nodes

  使用多个本机节点可以为 QEMU 无法处理的更复杂的情况提供更好的支持,并且通常具有更好的性能。

Cross-compilation

  交叉编译使多平台构建速度更快、用途更广泛,但必须要有相对应的编译器。

注意:QEMU 使用起来最简单,所以我们在x86_64平台上构建arm64镜像并运行容器时使用这种方式。

2.QEMU方式实现

如果是Docker Desktop ,可能已经预配置了 binfmt_misc 对其他平台的支持, 但对于其他版本 Docker, 你可能需要使用 tonistiigi/binfmt 镜像启动一个特权容器来进行支持,如果您的节点已经支持 QEMU(例如,如果您正在使用 Docker Desktop),QEMU 是最简单的入门方式。它不需要更改您的 Dockerfile,BuildKit 会自动检测可用的辅助架构。当 BuildKit 需要运行不同架构的二进制文件时,它会自动通过binfmt_misc 处理程序中注册的二进制文件加载它:

复制代码
docker run --privileged --rm tonistiigi/binfmt --install all

使用docker buildx ls查看,如下已经支持:

复制代码
docker buildx ls
NAME/NODE       DRIVER/ENDPOINT STATUS  BUILDKIT PLATFORMS
default *       docker
  default       default         running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux   docker
  desktop-linux desktop-linux   running 20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

当然这里有一个比较重要的一点:

binfmt_misc为了使在主机操作系统上注册的 QEMU 二进制文件能够在容器内透明地工作,必须使用fix_binary 标志进行注册。这需要内核 >= 4.8 和 binfmt-support >= 2.1.7。您可以通过检查F中的标志 是否正确来检查注册是否正确/proc/sys/fs/binfmt_misc/qemu-*。虽然 Docker Desktop 预先配置了binfmt_misc对其他平台的支持,但对于其他安装,可能需要使用映像进行安装tonistiigi/binfmt 。

3.builder的使用

可以使用默认的builder,也可以创建builder,默认的就是上边docker buildx ls中看到的,可以这样创建builder:

复制代码
docker buildx create --name mybuilder

启动builder:

复制代码
docker buildx inspect --bootstrap mybuilder

4.构建不同平台镜像

如下构建多平台镜像就可以

复制代码
docker buildx build --platform linux/arm64,linux/amd64 -t test/aa:v1 .
相关推荐
nhdh26 分钟前
Higress:AI时代云原生网关新选择
人工智能·云原生
帷幕落秋41 分钟前
Mysql的安装,加固与远程访问
运维·数据库
一隅论数智1 小时前
给AI Agent一颗“私域大脑“:本体增强的工程化之路
大数据·运维·数据仓库·人工智能·笔记·学习·政务
wdfk_prog1 小时前
Wi-Fi Direct 源码分析(11):P2P-GROUP-STARTED 之后——Group Interface、IP 配置与真实数据通路
运维·服务器·网络协议·tcp/ip·asp.net·p2p·wifi-direct
MicrosoftCloud1 小时前
用户权限 02|/etc/passwd、/etc/shadow、/etc/group:三个文件讲透 Linux 用户体系
linux·运维·ubuntu·用户管理·权限·useradd
天远API1 小时前
零信任架构实战:基于天远人车核验加强版构建自动化商用车承保核验网关
运维·人工智能·架构·自动化
崽崽..1 小时前
【Linux】ping命令刨析
linux·运维·服务器·网络
张小姐的猫2 小时前
【Linux】网络编程 —— 五种IO模型
linux·运维·服务器·网络·c++·人工智能·php
程序员-Benothing2 小时前
Shell脚本调试与最佳实践:set -eux、shellcheck实战
linux·运维·服务器
海宇AI2 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化直播开播鉴权网关
运维·人工智能·架构·自动化