buildx中怎么構(gòu)建多平臺 Docker 鏡像,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)服務(wù)項目包括博湖網(wǎng)站建設(shè)、博湖網(wǎng)站制作、博湖網(wǎng)頁制作以及博湖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,博湖網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到博湖省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
如果你能夠訪問目標(biāo) CPU 架構(gòu)的系統(tǒng),并且該操作系統(tǒng)支持運行構(gòu)建所需的各種工具,那么你可以直接在目標(biāo)系統(tǒng)上編譯程序。
以構(gòu)建 Docker 鏡像為例,你可以在樹莓派上安裝 Docker,然后在樹莓派上通過 Dockerfile
直接構(gòu)建 arm 平臺的鏡像。
如果無法訪問目標(biāo) CPU 架構(gòu)的系統(tǒng)該怎么辦?有沒有辦法通過某種方式直接在當(dāng)前系統(tǒng)上構(gòu)建目標(biāo) CPU 架構(gòu)的程序?請看下文...
還記得我們小時候在各種網(wǎng)吧臺球室之類的場合玩的街機游戲嗎?放張圖給你們回憶一下:
如果現(xiàn)在我們想重新體驗以前玩過的街機游戲該怎么辦?這時候就需要用到模擬器(Emulator)了。借助模擬器,我們可以讓時光倒流,體驗經(jīng)典游戲的樂趣。
模擬器除了可以用來玩游戲之外,還可以用來跨 CPU 架構(gòu)構(gòu)建程序。最常用的模擬器是開源的 QEMU,QEMU 支持許多常見的 CPU 架構(gòu),包括 ARM
、Power-PC
和 RISC-V
等。通過模擬一個完整的操作系統(tǒng),可以創(chuàng)建通用的 ARM 虛擬機,該虛擬機可以引導(dǎo) Linux,設(shè)置開發(fā)環(huán)境,也可以在虛擬機內(nèi)編譯程序。
然而,模擬整個操作系統(tǒng)還是有點浪費,因為在這種模式下,QEMU 將會模擬整個系統(tǒng),包括計時器、內(nèi)存控制器、總線控制器等硬件。但編譯程序根本不需要關(guān)心這些,還可以再精簡些。
在 Linux 上,QEMU
除了可以模擬完整的操作系統(tǒng)之外,還有另外一種模式叫用戶態(tài)模式
(User mod)。該模式下 QEMU 將通過 binfmt_misc 在 Linux 內(nèi)核中注冊一個二進(jìn)制轉(zhuǎn)換處理程序,并在程序運行時動態(tài)翻譯二進(jìn)制文件,根據(jù)需要將系統(tǒng)調(diào)用從目標(biāo) CPU 架構(gòu)轉(zhuǎn)換為當(dāng)前系統(tǒng)的 CPU 架構(gòu)。最終的效果看起來就像在本地運行目標(biāo) CPU 架構(gòu)的二進(jìn)制文件。
通過 QEMU 的用戶態(tài)模式,我們可以創(chuàng)建輕量級的虛擬機(chroot 或容器),然后在虛擬機系統(tǒng)中編譯程序,和本地編譯一樣簡單輕松。后面我們就會看到,跨平臺構(gòu)建 Docker 鏡像用的就是這個方法。
最后介紹一種嵌入式系統(tǒng)社區(qū)常用的方法:交叉編譯(cross-compilation)。
交叉編譯器是專門為在給定的系統(tǒng)平臺上運行而設(shè)計的編譯器,但是可以編譯出另一個系統(tǒng)平臺的可執(zhí)行文件。例如,amd64
架構(gòu)的 Linux 系統(tǒng)上的 C++ 交叉編譯器可以編譯出運行在 aarch74
(64-bit ARM) 架構(gòu)的嵌入式設(shè)備上的可執(zhí)行文件。再舉個真實的例子,安卓設(shè)備的 APP 基本上都是通過這種方法來編譯的。
從性能角度來看,該方法與方法一沒什么區(qū)別,因為不需要模擬器的參與,幾乎沒有性能損耗。但交叉編譯不具有通用性,它的復(fù)雜度取決于程序使用的語言,如果使用 Golang 的話,那就超級容易了。
在全民容器時代,我們討論構(gòu)建時不僅包括構(gòu)建單個可執(zhí)行文件,還包括構(gòu)建容器鏡像。而且構(gòu)建容器鏡像比上面說的方法更復(fù)雜,再加上 Docker 本身的復(fù)雜性,這幾乎是一個老大難的問題。
但引入了新的實驗性插件之后,構(gòu)建多平臺架構(gòu)的 Docker 鏡像就比以前容易多了,至于這個插件到底是啥,下文會詳細(xì)介紹。
利用 Docker 19.03 引入的插件 buildx,可以很輕松地構(gòu)建多平臺 Docker 鏡像。buildx 是 docker build ...
命令的下一代替代品,它利用 BuildKit 的全部功能擴(kuò)展了 docker build
的功能。
下面就來演示一下如何在短短幾分鐘內(nèi)使用 buildx
構(gòu)建出不同平臺的 Docker 鏡像。步驟如下:
要想使用 buildx
,首先要確保 Docker 版本不低于 19.03
,同時還要通過設(shè)置環(huán)境變量 DOCKER_CLI_EXPERIMENTAL
來啟用??梢酝ㄟ^下面的命令來為當(dāng)前終端啟用 buildx 插件:
???? → export DOCKER_CLI_EXPERIMENTAL=enabled
驗證是否開啟:
???? → docker buildx version github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7
如果在某些系統(tǒng)上設(shè)置環(huán)境變量 DOCKER_CLI_EXPERIMENTAL
不生效(比如 Arch Linux),你可以選擇從源代碼編譯:
???? → export DOCKER_BUILDKIT=1 ???? → docker build --platform=local -o . git://github.com/docker/buildx ???? → mkdir -p ~/.docker/cli-plugins && mv buildx ~/.docker/cli-plugins/docker-buildx
> 如果你使用的是 Docker 桌面版(MacOS 和 Windows),默認(rèn)已經(jīng)啟用了 binfmt_misc
,可以跳過這一步。
如果你使用的是 Linux,需要手動啟用 binfmt_misc
。大多數(shù) Linux 發(fā)行版都很容易啟用,不過還有一個更容易的辦法,直接運行一個特權(quán)容器,容器里面寫好了設(shè)置腳本:
???? → docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d
> 建議將 Linux 內(nèi)核版本升級到 4.x 以上,特別是 CentOS 用戶,你可能會遇到錯誤。
驗證是 binfmt_misc 否開啟:
???? → ls -al /proc/sys/fs/binfmt_misc/ 總用量 0 總用量 0 -rw-r--r-- 1 root root 0 11月 18 00:12 qemu-aarch74 -rw-r--r-- 1 root root 0 11月 18 00:12 qemu-arm -rw-r--r-- 1 root root 0 11月 18 00:12 qemu-ppc64le -rw-r--r-- 1 root root 0 11月 18 00:12 qemu-s390x --w------- 1 root root 0 11月 18 00:09 register -rw-r--r-- 1 root root 0 11月 18 00:12 status
驗證是否啟用了相應(yīng)的處理器:
???? → cat /proc/sys/fs/binfmt_misc/qemu-aarch74 enabled interpreter /usr/bin/qemu-aarch74 flags: OCF offset 0 magic 7f454c460201010000000000000000000200b7 mask ffffffffffffff00fffffffffffffffffeffff
Docker 默認(rèn)會使用不支持多 CPU 架構(gòu)的構(gòu)建器,我們需要手動切換。
先創(chuàng)建一個新的構(gòu)建器:
???? → docker buildx create --use --name mybuilder
啟動構(gòu)建器:
???? → docker buildx inspect mybuilder --bootstrap [+] Building 5.0s (1/1) FINISHED => [internal] booting buildkit 5.0s => => pulling image moby/buildkit:buildx-stable-1 4.4s => => creating container buildx_buildkit_mybuilder0 0.6s Name: mybuilder Driver: docker-container Nodes: Name: mybuilder0 Endpoint: unix:///var/run/docker.sock Status: running Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
查看當(dāng)前使用的構(gòu)建器及構(gòu)建器支持的 CPU 架構(gòu),可以看到支持很多 CPU 架構(gòu):
???? → docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS mybuilder * docker-container mybuilder0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 default docker default default running linux/amd64, linux/386
現(xiàn)在我們就可以構(gòu)建支持多 CPU 架構(gòu)的鏡像了!假設(shè)有一個簡單的 golang 程序源碼:
???? → cat hello.go package main import ( "fmt" "runtime" ) func main() { fmt.Printf("Hello, %s!\n", runtime.GOARCH) }
創(chuàng)建一個 Dockerfile 將該應(yīng)用容器化:
???? → cat Dockerfile FROM golang:alpine AS builder RUN mkdir /app ADD . /app/ WORKDIR /app RUN go build -o hello . FROM alpine RUN mkdir /app WORKDIR /app COPY --from=builder /app/hello . CMD ["./hello"]
這是一個多階段構(gòu)建 Dockerfile,使用 Go 編譯器來構(gòu)建應(yīng)用,并將構(gòu)建好的二進(jìn)制文件拷貝到 alpine 鏡像中。
現(xiàn)在就可以使用 buildx 構(gòu)建一個支持 arm、arm64 和 amd64 多架構(gòu)的 Docker 鏡像了,同時將其推送到 Docker Hub:
???? → docker buildx build -t yangchuansheng/hello-arch --platform=linux/arm,linux/arm64,linux/amd64 . --push
> 需要提前通過 docker login
命令登錄認(rèn)證 Docker Hub。
現(xiàn)在就可以通過 docker pull mirailabs/hello-arch
拉取剛剛創(chuàng)建的鏡像了,Docker 將會根據(jù)你的 CPU 架構(gòu)拉取匹配的鏡像。
背后的原理也很簡單,之前已經(jīng)提到過了,buildx 會通過 QEMU
和 binfmt_misc
分別為 3 個不同的 CPU 架構(gòu)(arm,arm64 和 amd64)構(gòu)建 3 個不同的鏡像。構(gòu)建完成后,就會創(chuàng)建一個 manifest list,其中包含了指向這 3 個鏡像的指針。
如果想將構(gòu)建好的鏡像保存在本地,可以將 type
指定為 docker
,但必須分別為不同的 CPU 架構(gòu)構(gòu)建不同的鏡像,不能合并成一個鏡像,即:
???? → docker buildx build -t yangchuansheng/hello-arch --platform=linux/arm -o type=docker . ???? → docker buildx build -t yangchuansheng/hello-arch --platform=linux/arm64 -o type=docker . ???? → docker buildx build -t yangchuansheng/hello-arch --platform=linux/amd64 -o type=docker .
由于之前已經(jīng)啟用了 binfmt_misc
,現(xiàn)在我們就可以運行任何 CPU 架構(gòu)的 Docker 鏡像了,因此可以在本地系統(tǒng)上測試之前生成的 3 個鏡像是否有問題。
首先列出每個鏡像的 digests
:
???? → docker buildx imagetools inspect yangchuansheng/hello-arch Name: docker.io/yangchuansheng/hello-arch:latest MediaType: application/vnd.docker.distribution.manifest.list.v2+json Digest: sha256:ec55f5ece9a12db0c6c367acda8fd1214f50ee502902f97b72f7bff268ebc35a Manifests: Name: docker.io/yangchuansheng/hello-arch:latest@sha256:38e083870044cfde7f23a2eec91e307ec645282e76fd0356a29b32122b11c639 MediaType: application/vnd.docker.distribution.manifest.v2+json Platform: linux/arm/v7 Name: docker.io/yangchuansheng/hello-arch:latest@sha256:de273a2a3ce92a5dc1e6f2d796bb85a81fe1a61f82c4caaf08efed9cf05af66d MediaType: application/vnd.docker.distribution.manifest.v2+json Platform: linux/arm64 Name: docker.io/yangchuansheng/hello-arch:latest@sha256:8b735708d7d30e9cd6eb993449b1047b7229e53fbcebe940217cb36194e9e3a2 MediaType: application/vnd.docker.distribution.manifest.v2+json Platform: linux/amd64
運行每一個鏡像并觀察輸出結(jié)果:
???? → docker run --rm docker.io/yangchuansheng/hello-arch:latest@sha256:38e083870044cfde7f23a2eec91e307ec645282e76fd0356a29b32122b11c639 Hello, arm! ???? → docker run --rm docker.io/yangchuansheng/hello-arch:latest@sha256:de273a2a3ce92a5dc1e6f2d796bb85a81fe1a61f82c4caaf08efed9cf05af66d Hello, arm64! ???? → docker run --rm docker.io/yangchuansheng/hello-arch:latest@sha256:8b735708d7d30e9cd6eb993449b1047b7229e53fbcebe940217cb36194e9e3a2 Hello, amd64!
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
文章題目:buildx中怎么構(gòu)建多平臺Docker鏡像
新聞來源:http://chinadenli.net/article0/jsidoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、微信公眾號、企業(yè)建站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)