Tim Wang Tech Blog

如何在Apple 芯片也称为M1芯片)上构建Docker镜像

How To Build Docker Images For Apple Silicon (Aka M1 Chip) 的中文翻译版本,内容有删减

背景(Background)

苹果不久前发布了基于M1芯片的新MacBook。与之前所有基于英特尔的Apple笔记本电脑不同,M1具有不同的架构 - arm64而不是英特尔的“amd64”。

新的架构意味着大多数软件产品应该重新编译,至少对于用编译语言编写的软件必须这样做。该规则适用于主要用Go写的项目。然而,这并不是100%正确的:苹果不遗余力地使旧的编译代码与新架构兼容,Roseta 2是用来达成这个目标的主要工具.

Docker 也试图迎头赶上 the M1 support came out a few weeks ago.但是,事情并不像预期那样无缝运行:

Docker依靠 qemu 在M1芯片上模拟英特尔的架构。然而事实是 QEMU有时不能很好地工作:在 Apple Silicon 机器上尝试运行基于 Intel 的容器可能会崩溃,因为 QEMU 有时无法运行容器。例如文件变更 API File System Events(例如 inotify)在 QEMU 仿真下不起作用 […]。 因此,我们建议您在 Apple Silicon 机器上运行 ARM64 容器。与基于 Intel 的容器相比,这些容器也更快且使用更少的内存

如何为arm64打包镜像(How to build an image for arm64

幸运的是,Docker 已经宣布 一项实验性功能 buildx,它可以为特定架构(arm64、amd64 等)构建映像。

Step 1.开启实验功能( Enable experimental features0

如果您使用的是 Mac 版 Docker Desktop,您只需在 Docker CLI 上启用实验性功能 —— 编辑 ~/.docker/config.json 添加以下内容:

{
  ...
  "experimental": "enabled"
}

之后重新启动您的 Docker Desktop

如果您使用的是 Linux,只需运行以下命令:

docker run --privileged --rm docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64

并使用 service docker restart 重启 Docker

Step 2. 创建一个新的构建器实例(Create a new builder instance)

创建一个新的构建器实例:

docker buildx create --use

It enables multiple builds in parallel. Make sure that new builder instance is created:

它支持多个并行构建。 可以用以下命令来确保创建了新的构建器实例:

Output:

$ docker buildx ls
NAME/NODE     DRIVER/ENDPOINT       STATUS  PLATFORMS
mystifying_bell * docker-container
  mystifying_bell0 unix:///var/run/docker.sock inactive
default      docker
  default     default           running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

Step 3. Build multi-architecture image#

Build your multi-architecture image:

通过以下命令构建您的多架构映像:

docker buildx build --platform linux/amd64,linux/arm64 -t company/image_name .

platform 标志指定将为哪些平台构建 Docker 映像。 目前Docker 支持 10 个平台,但可能你应该只使用 linux/amd64 (Intel) 和 linux/arm64 (M1):

Docker Hub result

Reference