欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

buildx中怎么構(gòu)建多平臺Docker鏡像

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)硬件上編譯

如果你能夠訪問目標(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)的程序?請看下文...

方法二:模擬目標(biāo)硬件

還記得我們小時候在各種網(wǎng)吧臺球室之類的場合玩的街機游戲嗎?放張圖給你們回憶一下:

buildx中怎么構(gòu)建多平臺 Docker 鏡像

如果現(xiàn)在我們想重新體驗以前玩過的街機游戲該怎么辦?這時候就需要用到模擬器(Emulator)了。借助模擬器,我們可以讓時光倒流,體驗經(jīng)典游戲的樂趣。

模擬器除了可以用來玩游戲之外,還可以用來跨 CPU 架構(gòu)構(gòu)建程序。最常用的模擬器是開源的 QEMU,QEMU 支持許多常見的 CPU 架構(gòu),包括 ARM、Power-PCRISC-V 等。通過模擬一個完整的操作系統(tǒng),可以創(chuàng)建通用的 ARM 虛擬機,該虛擬機可以引導(dǎo) Linux,設(shè)置開發(fā)環(huán)境,也可以在虛擬機內(nèi)編譯程序。

然而,模擬整個操作系統(tǒng)還是有點浪費,因為在這種模式下,QEMU 將會模擬整個系統(tǒng),包括計時器、內(nèi)存控制器、總線控制器等硬件。但編譯程序根本不需要關(guān)心這些,還可以再精簡些。

方法三:通過 binfmt_misc 模擬目標(biāo)硬件的用戶空間

在 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ì)介紹。

2. 構(gòu)建多平臺 Docker 鏡像

利用 Docker 19.03 引入的插件 buildx,可以很輕松地構(gòu)建多平臺 Docker 鏡像。buildx 是 docker build ... 命令的下一代替代品,它利用 BuildKit 的全部功能擴(kuò)展了 docker build 的功能。

下面就來演示一下如何在短短幾分鐘內(nèi)使用 buildx 構(gòu)建出不同平臺的 Docker 鏡像。步驟如下:

啟用 buildx 插件

要想使用 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

啟用 binfmt_misc

> 如果你使用的是 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

從默認(rèn)的構(gòu)建器切換到多平臺構(gòu)建器

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

構(gòu)建多平臺鏡像

現(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 會通過 QEMUbinfmt_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)

營銷型網(wǎng)站建設(shè)
中文字幕熟女人妻视频| 日本中文在线不卡视频| 欧美日本道一区二区三区| 久久精品中文字幕人妻中文| 久久精品国产在热亚洲| 一区二区三区日韩中文| 亚洲欧美一二区日韩高清在线 | 亚洲欧美视频欧美视频| 成年男女午夜久久久精品| 亚洲综合色在线视频香蕉视频| 国产传媒免费观看视频| 久久精品国产第一区二区三区| 亚洲综合伊人五月天中文| 亚洲一区二区三区三区| 欧美午夜性刺激在线观看| 亚洲精品av少妇在线观看| 老司机精品视频在线免费看| 日韩特级黄片免费在线观看| 亚洲精品国产福利在线| 99久久国产精品成人观看| 亚洲熟妇熟女久久精品| 亚洲一区二区亚洲日本| 午夜精品一区二区av| 日本亚洲精品在线观看| 欧美做爰猛烈叫床大尺度| 亚洲欧美日韩综合在线成成| 国产又猛又黄又粗又爽无遮挡| 女人高潮被爽到呻吟在线观看| 亚洲一区二区三区福利视频| 欧美午夜国产在线观看| 日本在线不卡高清欧美| 精品日韩视频在线观看| 亚洲一区二区三区有码| 国产欧美亚洲精品自拍| 尹人大香蕉一级片免费看| 亚洲精品美女三级完整版视频| 成人午夜在线视频观看| 麻豆欧美精品国产综合久久| 亚洲精品国产美女久久久99| 亚洲精品美女三级完整版视频| 欧美一区二区三区性视频|