如何在 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”期间添加此架构。

更新于:2022-12-28

9K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始
广告