首页 > 其他分享 >在 X86_64(amd64) 平台上的docker支持打包跨平台的镜像(如arm64)

在 X86_64(amd64) 平台上的docker支持打包跨平台的镜像(如arm64)

时间:2024-10-09 09:45:36浏览次数:10  
标签:run X86 -- 跨平台 64 rm docker root Docker

在信创,ARM开始崛起的现在,Docker 也从一开始的只支持 x86_64 架构变为支持各种架构了,虽然 Docker 的目的是保证只要 Docker 安装好,在任意机器上运行都能达到一样的效果,但是这个的前提是Docker镜像的架构和当前服务器的架构一致,以前都是 x84_64架构自然可以,但现在也有别的架构,因此 一个镜像如果只有 x86_64 架构的版本,那么是无法在
Arm 架构的服务器上运行的。

和运行同理,打包也是如此,x86_64 的机器只能打包 x86_64 的镜像。

但是新版本的 docker (从 server 版本 大于 19.10 开始) 有了一个插件 buildx , 这个插件支持从一个平台构建多个平台的镜像。

下面是常见的几种方式

Docker Desktop

此软件是用于开发,测试使用的,很方便,因为新版本默认集成了 buildx ,也集成了多平台镜像模拟运行。、

我安装的版本

docker version

输出结果

Client:
 Cloud integration: v1.0.35+desktop.13
 Version:           26.1.1
 API version:       1.45
 Go version:        go1.21.9
 Git commit:        4cf5afa
 Built:             Tue Apr 30 11:46:57 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Desktop
 Engine:
  Version:          26.1.1
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.9
  Git commit:       ac2de55
  Built:            Tue Apr 30 11:48:28 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.31
  GitCommit:        e377cd56a71523140ca6ae87e30244719194a521
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

buildx 情况

docker buildx ls

输出

NAME/NODE       DRIVER/ENDPOINT   STATUS    BUILDKIT   PLATFORMS
default*        docker
 \_ default      \_ default       running   v0.13.2    linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/loong64, linux/ppc64

可以看到,build 支持打包多个架构的镜像,如打包 linux/arm64的,只需要如下执行即可

docker build -t test1 --platform linux/arm64 .
docker build --platform linux/amd64,linux/arm64 .

默认情况下,Docker Desktop 支持在仿真下运行和构建多平台镜像。无需配置,因为生成器使用捆绑在 Docker Desktop VM 中的 QEMU。

Docker Server

Docker Desktop 是用于 windows ,mac上开发使用的,实际使用肯定是在 linux 上的,此时装的都是 Docker Server 服务,如 docker-ce ,由于默认情况下是不支持多平台的,所以需要参考官方文档:

多平台 |Docker 文档 --- Multi-platform | Docker Docs(https://docs.docker.com/build/building/multi-platform/)

文档中介绍了三种方式,分别是 QEMU 模拟仿真,使用具有多个原生节点的构建器, 将交叉编译与多阶段构建结合使用,下面别分介绍

QEMU

这个最简单,不过需要满足一些条件(不一定是所有条件都需要有效,但是开着准没错)

  • 物理机环境变量 DOCKER_BUILDKIT=1,应该会有用
  • 物理机环境变量 DOCKER_CLI_EXPERIMENTAL=enabled,应该会有用
  • 物理机 Linux 内核版本 4.8 或更高版本,即 uname -r 的输出版本号大于4.8 ,否则会存在各种奇奇怪怪的错误。
  • binfmt-support 版本 2.1.7 或更高版本,Ubuntu 可以通过 apt-cache policy binfmt-support 查看版本
  • QEMU 二进制文件必须静态编译并使用 fix_binary 标志进行注册

一般情况下,你只要内核版本满足,binfmt-support 啥的也能满足

QEMU 安装

官网推荐是通过镜像 tonistiigi/binfmt 来操作,常用操作命令如下:

# 查看支持的架构和模拟器列表
docker run --privileged --rm tonistiigi/binfmt:master

# 安装所有架构模拟器
docker run --privileged --rm tonistiigi/binfmt:master --install all
# 安装指定架构的
docker run --privileged --rm tonistiigi/binfmt:master --install arm64,riscv64,arm

# 删除所有架构
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-*
# 删除指定架构
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-aarch64

# 查看版本
docker run --privileged --rm tonistiigi/binfmt:master --version

# 查看帮助
docker run --privileged --rm tonistiigi/binfmt:master --help

验证命令

docker run --rm arm32v6/alpine:3.20.3 uname -a
docker run --rm arm32v7/alpine:3.20.3 uname -a
docker run --rm arm64v8/alpine:3.20.3 uname -a
docker run --rm s390x/alpine:3.20.3 uname -a
docker run --rm i386/alpine:3.20.3 uname -a
docker run --rm ppc64le/alpine:3.20.3 uname -a
docker run --rm riscv64/alpine:3.20.3 uname -a
docker run --rm amd64/alpine:3.20.3 uname -a
docker run --rm alpine:3.20.3 uname -a

查看安装好的注册节点

ls -alh /proc/sys/fs/binfmt_misc

输出:

drwxr-xr-x 2 root root 0 Sep 24 13:46 .
dr-xr-xr-x 1 root root 0 Sep 24 13:46 ..
-rw-r--r-- 1 root root 0 Sep 24 13:46 WSLInterop
-rw-r--r-- 1 root root 0 Sep 24 13:46 WSLInterop-late
-rw-r--r-- 1 root root 0 Sep 24 13:46 aarch64
-rw-r--r-- 1 root root 0 Sep 24 13:46 arm
-rw-r--r-- 1 root root 0 Sep 24 13:46 mips64
-rw-r--r-- 1 root root 0 Sep 24 13:46 mips64le
-rw-r--r-- 1 root root 0 Sep 24 13:46 ppc64le
-rw-r--r-- 1 root root 0 Sep 25 23:10 qemu-loongarch64
-rw-r--r-- 1 root root 0 Sep 25 23:10 qemu-s390x
--w------- 1 root root 0 Sep 25 23:07 register
-rw-r--r-- 1 root root 0 Sep 24 13:46 riscv64
-rw-r--r-- 1 root root 0 Sep 24 13:46 status

如果上面的都不行,那么可能就是存在一些特殊情况了,可以使用 tonistiigi/binfmt 类似的 multiarch/qemu-user-static , 这个也很牛皮,可以在早期的docker 版本上实现跨平台打包镜像,如 docker 19.10 左右的版本,但是需要自己去深入研究一下。

使用命令如下:

$ uname -m
x86_64

$ docker run --rm -t arm64v8/ubuntu uname -m
standard_init_linux.go:211: exec user process caused "exec format error"

$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

$ docker run --rm -t arm64v8/ubuntu uname -m
aarch64

# 查看帮助说明
docker run --rm --privileged multiarch/qemu-user-static:latest --help
# 安装除了当前处理器支持的架构之外的模拟器
docker run --rm --privileged multiarch/qemu-user-static:latest
# 删除现有的模拟器,安装除了当前处理器支持的架构之外的模拟器
docker run --rm --privileged multiarch/qemu-user-static:latest --reset
# 删除现有的模拟器,安装除了当前处理器支持的架构之外的模拟器,并且持久化
docker run --rm --privileged multiarch/qemu-user-static:latest --reset -p yes
# 查看安装的模拟器列表
ls -alh /proc/sys/fs/binfmt_misc

使用 QEMU 进行仿真可能比原生构建慢得多,尤其是对于编译和压缩或解压缩等计算密集型任务。

默认情况下,Docker Desktop 支持在仿真下运行和构建多平台镜像。无需配置,因为生成器使用捆绑在 Docker Desktop VM 中的 QEMU。

多个原生节点

需要额外的机器,即有对应的不同平台的机器集群打包,不考虑,我有额外的机器了,就不用纠结这个了

交叉编译

根据您的项目,如果您使用的编程语言对交叉编译有很好的支持,则可以利用多阶段构建从构建器的本机架构为目标平台构建二进制文件。特殊的构建参数(如 BUILDPLATFORMTARGETPLATFORM)会自动在 Dockerfile 中使用。

# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log

Docker in Docker

很多情况都是因为docker所处的内核版本等等不足导致,那么就可以尝试使用 Docker in Docker ,套娃的方式打包。性能会低一点,至少可以打包,还没那么多问题

GitHub - crazy-max/docker-docker: Docker in Docker (DinD) image(https://github.com/crazy-max/docker-docker#about)

参考链接

标签:run,X86,--,跨平台,64,rm,docker,root,Docker
From: https://www.cnblogs.com/DHclly/p/18453591

相关文章

  • 记录MinGW-64 windows下载问题(很大一个坑)
    近期因为某些原因,需要在windows中下载MinGW工具集,但是却遇到了很大一个坑。问题描述:按照网上很多教程,在sourceforge网站上下载,链接如下。sourceforge下载MinGW如下图,进入该网址后,点击DownloadLatestVersion按钮,发现只能下载源码,因为缺乏对源码的编译经验(经验不太够),导致遇......
  • [AGC064C] Erase and Divide Game 题解
    DescriptionTakahashi和Aoki玩游戏。先在黑板上写若干个数,由\(N\)个互不相交的区间\([l_i,r_i]\)组成。两人轮流操作,每次操作先删去所有的奇数/偶数,再把剩下的数除以\(2\)(向下取整),无法操作的人输。Takahashi先手,假设两人都采用最优策略,问谁能获胜。\(1\leqN\leq10^......
  • 硬件检测工具 AIDA64 Extreme 序列号
    AIDA64Extreme功能强悍,既可以快速并详细的查找你的设备信息,还可以对你的设备稳定性,内存及磁盘驱动器进行系统性的评估,并且兼容32及64位的windows操作系统。该版本已内置序列号,可以使用全部功能。使用说明:1、将压缩文件解压到某固定位置,不要随意移动。2、解压后,双击start_......
  • jarvisoj_level2_x64 1 writeup and blog
    Hereifinishthejarvisoj_level2_x641challengeinbuuctfandhereissomewriteup......
  • H7-TOOL的1拖4脱机烧录SPI Flash芯片XM25QU64在1.8V供电时满速下载的稳定性测试
    XM25QU64规格:XM25QU64C实测1.8V(脱机烧录上位机这里和微型数控电源界面都设置TVCC为1.8V),1拖4转接板方式,直接将芯片放入转接板,稳定好用:时钟电平1.8V实际效果: ......
  • DSP概述及应用——TMS320DM6437ZDU4、TMS320DM6437ZWT6、TMS320DM6437ZWT7数字媒体处
    概述:TMS320DM6437是一款DSP芯片,具有强大的处理能力和丰富的功能模块。TMS320DM6437采用基于超标量架构的C64x+内核,具有高效的乘法累加单元和多格式指令集,能够在单个时钟周期内执行两条指令,大大提高了运算速度和效率。TMS320DM6437采用基于超标量架构的C64x+内核,具有高效的乘法累......
  • P10641 BZOJ3252 攻略
    题目链接简要题意给定一个有\(n\)个结点的树,树有点权且点权为正整数。现选取\(k\)条从根结点出发到叶子结点的简单路径,求这些路径的并集上所有结点的点权之和的最大值。主要算法贪心,树链剖分,(线段树合并)思路一个显然的贪心,每次选一点点权和最大的链,再讲这条链清为0。正......
  • CSM4064 一款带防反接功能的充电芯片 适用于4054容易烧坏、耐高压成本高的情况
            CSM4064是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其SOT23-5封装与较少的外部元件数量使得CSM4064成为便携式应用的理想选择。        CSM4064可以适合USB电源和适配器电源工作。特点:高达600mA的可编程充电电流无需......
  • CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&
    CentOS报错:Couldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32errorwas14:curl#6-"Couldnotresolvehost:mirrorlist.centos.org;Unknownerror"关于CentOS报错:Couldnotretrievemirr......
  • 错误消息:#1064 - You have an error in your SQL syntax; check the manual that corr
    错误消息:#1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'...'atline1原因:SQL语句中有语法错误。括号不匹配。关键字拼写错误。解决方法:检查SQL语句:确认SQ......