如何在 arm64 主機平臺上執行 amd64 Docker 映象?
在瞭解如何在 arm64 主機平臺上執行 amd64 docker 映象之前,我們必須瞭解這意味著什麼。有一個術語叫做多架構或多平臺 docker 容器映象。這些映象包含在容器化映象時提供的各種基礎或主機架構上執行的能力。
多平臺映象的必要性
假設您是一名 DevOps 工程師,您必須為一家 IT 公司準備一個 Web 伺服器。您有一個 amd64 主機平臺,但是當您將映象交付給該公司時,您瞭解到該公司僅在 amr64 主機平臺上工作。即使您非常出色地準備了 Web 伺服器,但它也無法在 arm 機器上工作,因為容器映象是專門為 amd64 架構構建的。此問題將我們引入多架構 docker 映象的世界。
如何檢查映象的架構?
適用於 Ubuntu、Alpine、Busybox 和 Raspbian 映象的命令。
示例
$ docker run ubuntu uname -m output: x86_64 $ docker run alpine uname -m output: x86_64 $ docker run busybox uname -m output: x86_64 #docker run raspbian/stretch uname -m armv7l
建立多平臺映象
使用 dockerfile 和 docker 守護程式提供的 docker builder 功能分步執行以下過程以建立多平臺映象。
步驟 1:為映象構建建立 dockerfile。
這裡我們建立了一個極簡的 dockerfile。
示例
#Here we will use the busybox as the base image FROM busybox:latest RUN echo "hello this is busybox" CMD ["uname" "-m"]
步驟 2:構建已建立的 Dockerfile
現在,我們將使用 buildx 功能構建此 dockerfile。通常,我們使用“docker build”建立映象,但在這裡我們將使用“docker buildx”,因為它為開發人員提供了更大的構建靈活性。
示例
$ docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ -t <dockerhub_Username>/buildx_image_new .
輸出
[+] Building 34.0s (16/16) FINISHED => [internal] booting buildkit 4.4s => => pulling image moby/buildkit:buildx-stable-1 3.2s => => creating container buildx_buildkit_mynewbuilder0 1.2s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 162B 0.1s => [linux/arm64 internal] load metadata for docker.io/library/busybox:latest 8.3s => [linux/arm/v6 internal] load metadata for docker.io/library/busybox:latest 7.6s => [linux/amd64 internal] load metadata for docker.io/library/busybox:latest 8.4s => [auth] library/busybox:pull token for registry-1.docker.io 0.0s => [linux/amd64 1/2] FROM docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65 0.1s => => resolve docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65f5757a954831 0.1s => [linux/arm64 1/2] FROM docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65 0.1s => => resolve docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65f5757a954831 0.1s => [linux/arm/v6 1/2] FROM docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d6 3.2s => => resolve docker.io/library/busybox:latest@sha256:fcd85228d7a25feb59f101ac3a955d27c80df4ad824d65f5757a954831 0.1s => => sha256:1f034cc8a3763179d1066acbd5441a02c518c2697c7615def9a6edce981b70d1 953.68kB / 953.68kB 3.0s => => extracting sha256:1f034cc8a3763179d1066acbd5441a02c518c2697c7615def9a6edce981b70d1 0.1s => CACHED [linux/arm64 2/2] RUN echo "hello this is busybox" 0.0s => CACHED [linux/amd64 2/2] RUN echo "hello this is busybox" 0.0s => [linux/arm/v6 2/2] RUN echo "hello this is busybox" 0.3s => exporting to image 17.4s => => exporting layers 0.1s => => exporting manifest sha256:ff2057bc3b087bf2b731a0063b44f74d24a2b5e48ee9902547421574d7ec9bf9 0.0s => => exporting config sha256:e4550dd445e9e1fe2cbe5c18fb745f795cf8fe9e0d17309be9664e33c2ef8d9a 0.0s => => exporting manifest sha256:360c05bf0afe9057b778991d1ed29a5fead857f67b555d58ef4a2db39caf5532 0.0s => => exporting config sha256:b8c5096ae3829ec9e0a02d73654a15883f31fab05189039e3d680d637d642761 0.0s => => exporting manifest sha256:cd5f9f98ba829e12c82ab63b1be7432a70125aadbb9a89dc51609d6e9cee6a23 0.0s => => exporting config sha256:2c550e8596608e89b705738ee6e20543bede26bff74fcf2a82baad72ae215a48 0.0s => => exporting manifest list sha256:d74f387cab65b336185b91491aff79c263018fb6d1acd6e0a7c37537333cc1e3 0.0s => => pushing layers 13.6s => => pushing manifest for docker.io/<dockerhub_Username>//buildx_image_new:latest@sha256:d74f387cab65b336185b91491aff79c 3.5s => [auth] <dockerhub_Username>//buildx_image_new:pull,push token for registry-1.docker.io 0.0s => [auth] <dockerhub_Username>//buildx_image:pull <dockerhub_Username>//buildx_image_new:pull,push token for registry-1.docker.io 0.0s
現在轉到 docker hub 並登入您的使用者名稱,並在儲存庫中檢查是否存在任何名稱與您上傳或推送的名稱相同的映象。
如果您在上述命令執行中遇到任何問題,請首先使用“docker login”命令在終端上登入您的 docker hub,然後根據需要輸入“使用者名稱”和“密碼”。
透過以上步驟,我們在“amd64”主機架構上建立了一個多平臺 docker 映象。現在,我們可以在“linux/amd64”上以及“linux/arm64”上使用此 docker 映象。
在 amd 主機平臺上建立容器
透過使用以下給出的命令,您現在可以在 amd 主機平臺上建立一個 busybox 容器。首先,您需要使用“docker pull”將映象拉取到主機機器,然後您可以使用“docker run”將其容器化。使用在建立映象期間使用的相同 docker hub 使用者名稱,並將其推送到儲存庫。
示例 1
$ docker pull <dockerhub_Username>/buildx_image_new
輸出
Using default tag: latest latest: Pulling from <dockerhub_Username>/buildx_image_new Digest: sha256:d74f387cab65b336185b91491aff79c263018fb6d1acd6e0a7c37537333cc1e3 Status: Downloaded newer image for <dockerhub_Username>/buildx_image_new:latest docker.io/<dockerhub_Username>/buildx_image_new:latest
讓我們檢查映象是否已從儲存庫中拉取。
示例 2
$docker images
輸出
<dockerhub_Username>/buildx_image_new latest e4550dd445e9 5 days ago 1.24MB
映象成功拉取後,讓我們在此 amd 系統上執行此映象。
示例 3
$ docker run –it \ --name host_amd64 \ <dockerhub_Username>/buildx_image
輸出
x86_64
在 arm 主機平臺上建立容器
這裡我們使用了 Raspberry pi,因為它在 arm 架構上執行。
步驟 1:在 raspbian OS 上安裝 docker 客戶端和 docker 容器。
首先,更新和升級 apt-get 儲存庫。
$sudo apt-get update && sudo apt-get upgrade
現在下載 get_docker.sh 指令碼。
$curl -fsSL get.docker.com -o get-docker.sh
使用“ls”檢查指令碼是否已下載。
$ls
現在執行此指令碼以在 raspberry pi 機器上安裝 docker。
$sh get-docker.sh
現在您需要將 raspbian 使用者追加到 docker 組。
$sudo usermod -aG docker $USER
重新啟動 raspbian OS 以執行所有更改。
$sudo restart
步驟 2:現在拉取相同的 docker 映象
示例
$ docker pull <dockerhub_Username>/buildx_image
輸出
Using default tag: latest latest: Pulling from <dockerhub_Username>/buildx_image_new 1f034cc8a376: Pull complete 92d2a98e1f6d: Pull complete Digest: sha256:d74f387cab65b336185b91491aff79c263018fb6d1acd6e0a7c37537333cc1e3 Status: Downloaded newer image for <dockerhub_Username>/buildx_image_new:latest docker.io/<dockerhub_Username>/buildx_image_new:latest
步驟 3:現在執行此 docker 映象
示例
$ docker run –it \ --name host_arm \ <dockerhub_Username>/buildx_image
輸出
armv7l
這是在 arm 主機平臺上執行 amd 建立的映象的方法。如果這無法在 raspbian os 上執行映象,請使用命令“uname –m”檢查 raspberry pi 的架構,並在建立“buildx image”期間新增此架構。