柚子快報(bào)激活碼778899分享:docker 在 X86
柚子快報(bào)激活碼778899分享:docker 在 X86
在信創(chuàng),ARM開(kāi)始崛起的現(xiàn)在,Docker 也從一開(kāi)始的只支持 x86_64 架構(gòu)變?yōu)橹С指鞣N架構(gòu)了,雖然 Docker 的目的是保證只要 Docker 安裝好,在任意機(jī)器上運(yùn)行都能達(dá)到一樣的效果,但是這個(gè)的前提是Docker鏡像的架構(gòu)和當(dāng)前服務(wù)器的架構(gòu)一致,以前都是 x84_64架構(gòu)自然可以,但現(xiàn)在也有別的架構(gòu),因此 一個(gè)鏡像如果只有 x86_64 架構(gòu)的版本,那么是無(wú)法在 Arm 架構(gòu)的服務(wù)器上運(yùn)行的。
和運(yùn)行同理,打包也是如此,x86_64 的機(jī)器只能打包 x86_64 的鏡像。
但是新版本的 docker (從 server 版本 大于 19.10 開(kāi)始) 有了一個(gè)插件 buildx , 這個(gè)插件支持從一個(gè)平臺(tái)構(gòu)建多個(gè)平臺(tái)的鏡像。
下面是常見(jiàn)的幾種方式
Docker Desktop
此軟件是用于開(kāi)發(fā),測(cè)試使用的,很方便,因?yàn)樾掳姹灸J(rèn)集成了 buildx ,也集成了多平臺(tái)鏡像模擬運(yùn)行。、
我安裝的版本
docker version
輸出結(jié)果
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 支持打包多個(gè)架構(gòu)的鏡像,如打包 linux/arm64的,只需要如下執(zhí)行即可
docker build -t test1 --platform linux/arm64 .
docker build --platform linux/amd64,linux/arm64 .
默認(rèn)情況下,Docker Desktop 支持在仿真下運(yùn)行和構(gòu)建多平臺(tái)鏡像。無(wú)需配置,因?yàn)樯善魇褂美壴?Docker Desktop VM 中的 QEMU。
Docker Server
Docker Desktop 是用于 windows ,mac上開(kāi)發(fā)使用的,實(shí)際使用肯定是在 linux 上的,此時(shí)裝的都是 Docker Server 服務(wù),如 docker-ce ,由于默認(rèn)情況下是不支持多平臺(tái)的,所以需要參考官方文檔:
多平臺(tái) |Docker 文檔 — Multi-platform | Docker Docs(https://docs.docker.com/build/building/multi-platform/)
文檔中介紹了三種方式,分別是 QEMU 模擬仿真,使用具有多個(gè)原生節(jié)點(diǎn)的構(gòu)建器, 將交叉編譯與多階段構(gòu)建結(jié)合使用,下面別分介紹
QEMU
這個(gè)最簡(jiǎn)單,不過(guò)需要滿足一些條件(不一定是所有條件都需要有效,但是開(kāi)著準(zhǔn)沒(méi)錯(cuò))
物理機(jī)環(huán)境變量 DOCKER_BUILDKIT=1,應(yīng)該會(huì)有用物理機(jī)環(huán)境變量 DOCKER_CLI_EXPERIMENTAL=enabled,應(yīng)該會(huì)有用物理機(jī) Linux 內(nèi)核版本 4.8 或更高版本,即 uname -r 的輸出版本號(hào)大于4.8 ,否則會(huì)存在各種奇奇怪怪的錯(cuò)誤。binfmt-support 版本 2.1.7 或更高版本,Ubuntu 可以通過(guò) apt-cache policy binfmt-support 查看版本QEMU 二進(jìn)制文件必須靜態(tài)編譯并使用 fix_binary 標(biāo)志進(jìn)行注冊(cè)
一般情況下,你只要內(nèi)核版本滿足,binfmt-support 啥的也能滿足
QEMU 安裝
官網(wǎng)推薦是通過(guò)鏡像 tonistiigi/binfmt 來(lái)操作,常用操作命令如下:
# 查看支持的架構(gòu)和模擬器列表
docker run --privileged --rm tonistiigi/binfmt:master
# 安裝所有架構(gòu)模擬器
docker run --privileged --rm tonistiigi/binfmt:master --install all
# 安裝指定架構(gòu)的
docker run --privileged --rm tonistiigi/binfmt:master --install arm64,riscv64,arm
# 刪除所有架構(gòu)
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-*
# 刪除指定架構(gòu)
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
驗(yàn)證命令
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
查看安裝好的注冊(cè)節(jié)點(diǎn)
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 , 這個(gè)也很牛皮,可以在早期的docker 版本上實(shí)現(xiàn)跨平臺(tái)打包鏡像,如 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
# 查看幫助說(shuō)明
docker run --rm --privileged multiarch/qemu-user-static:latest --help
# 安裝除了當(dāng)前處理器支持的架構(gòu)之外的模擬器
docker run --rm --privileged multiarch/qemu-user-static:latest
# 刪除現(xiàn)有的模擬器,安裝除了當(dāng)前處理器支持的架構(gòu)之外的模擬器
docker run --rm --privileged multiarch/qemu-user-static:latest --reset
# 刪除現(xiàn)有的模擬器,安裝除了當(dāng)前處理器支持的架構(gòu)之外的模擬器,并且持久化
docker run --rm --privileged multiarch/qemu-user-static:latest --reset -p yes
# 查看安裝的模擬器列表
ls -alh /proc/sys/fs/binfmt_misc
使用 QEMU 進(jìn)行仿真可能比原生構(gòu)建慢得多,尤其是對(duì)于編譯和壓縮或解壓縮等計(jì)算密集型任務(wù)。
默認(rèn)情況下,Docker Desktop 支持在仿真下運(yùn)行和構(gòu)建多平臺(tái)鏡像。無(wú)需配置,因?yàn)樯善魇褂美壴?Docker Desktop VM 中的 QEMU。
多個(gè)原生節(jié)點(diǎn)
需要額外的機(jī)器,即有對(duì)應(yīng)的不同平臺(tái)的機(jī)器集群打包,不考慮,我有額外的機(jī)器了,就不用糾結(jié)這個(gè)了
交叉編譯
根據(jù)您的項(xiàng)目,如果您使用的編程語(yǔ)言對(duì)交叉編譯有很好的支持,則可以利用多階段構(gòu)建從構(gòu)建器的本機(jī)架構(gòu)為目標(biāo)平臺(tái)構(gòu)建二進(jìn)制文件。特殊的構(gòu)建參數(shù)(如 BUILDPLATFORM 和 TARGETPLATFORM)會(huì)自動(dòng)在 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
很多情況都是因?yàn)閐ocker所處的內(nèi)核版本等等不足導(dǎo)致,那么就可以嘗試使用 Docker in Docker ,套娃的方式打包。性能會(huì)低一點(diǎn),至少可以打包,還沒(méi)那么多問(wèn)題
GitHub - crazy-max/docker-docker: Docker in Docker (DinD) image(https://github.com/crazy-max/docker-docker#about)
參考鏈接
“sh: write error: Invalid argument” errors when register · Issue #38 · multiarch/qemu-user-static · GitHub(https://github.com/multiarch/qemu-user-static/issues/38)sh: write error: Invalid argument - Centos 7 · Issue #100 · multiarch/qemu-user-static · GitHub(https://github.com/multiarch/qemu-user-static/issues/100)failed to load LLB: runtime execution on platform linux/arm64 not supported · Issue #138 · docker/buildx · GitHub(https://github.com/docker/buildx/issues/138)buildx is not a docker command on linux/amd64 ? · Issue #132 · docker/buildx · GitHub(https://github.com/docker/buildx/issues/132#issuecomment-521759117)GitHub - crazy-max/docker-docker: Docker in Docker (DinD) image(https://github.com/crazy-max/docker-docker#about)sh: write error: Invalid argument - Centos 7 qemu報(bào)錯(cuò)解決方案 - 小小記錄本 - 博客園(https://www.cnblogs.com/xiaojiluben/p/16745276.html)多架構(gòu) Docker 鏡像 ·Maartje Eyskens — Multiarch Docker Images · Maartje Eyskens(https://eyskens.me/multiarch-docker-images/)
柚子快報(bào)激活碼778899分享:docker 在 X86
文章來(lái)源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。