logo科技微讯

Docker 对 Apple Silicon 的支持

作者:科技微讯
日期:2023-04-03
📝 笔记

这篇笔记有助于我们搞清楚 Apple Silicon 电脑如何正确地使用 Docker Desktop。

2019 年 4 月,Docker Desktop 开始支持 ARM 镜像和容器的开发,这意味着开发者可以在 x86/amd64 电脑上创建和运行 ARM 镜像,这是通过 QEMU emulation 实现的。当时 Apple Silicon 还没有发布,所以反过来,能不能在 ARM 电脑上创建和运行 x86/amd64 镜像还不知道。

docker-qemu-diagram

2020 年 11 月,第一款搭载 Apple Silicon 的电脑发布,这是一部 MacBook Air。当时 Docker Desktop 无法在 M1 电脑运行,打开时会提示 CPU 架构不兼容。

一个月后,即 2020 年 12 月,Docker Desktop 发布第一个适配 Apple Silicon 的版本,除了把代码编译为原生 ARM 代码之外,还把 HyperKit(如上图) 替换成苹果的 Virtualization Framework,这是一个用来创建并管理 Linux VM 的框架,Linux VM 其实就是容器的运行环境。

In macOS 13 and later on Mac computers with Apple silicon chips, the Virtualization framework supports Rosetta in ARM Linux virtual machines (VMs). 出处

这个版本的 Docker Desktop 支持在 ARM 电脑上创建和运行 x86/amd64 镜像,就像 2019 年开始支持的在 x86/amd64 电脑上创建和运行 ARM 镜像,只是反过来了。虽然 Docker Desktop 使用了 Virtualization 框架,但它依然使用 QEMU 转译 x86/amd64 代码,而不是 Rosetta。QEMU 并不完美,有时会导致容器在运行中崩溃。Docker 官方在 Known issues for Mac with Apple silicon 这个页面中表示:

Attempts to run Intel-based containers on Apple silicon machines under emulation can crash as qemu sometimes fails to run the container. 出处

所以 Docker 表示,在 ARM 电脑上运行容器,尽量运行 ARM 容器,而不是通过 emulation 运行 x86/amd64 容器,如果你的镜像需要发布出去给其他开发者使用,建议针对 x86/amd64、ARM 分别发布一个版本:

We recommend running ARM64 containers on Apple silicon machines whenever possible, and encouraging container authors to produce ARM64, or multi-arch, versions of their containers. 出处

docker build 使用 --platform 参数可生成对应平台的镜像,docker run 也有 --platform 参数,通常和 docker build 同步。

# 没有使用 --platform 参数,生成的镜像平台和 Dockerfile 中的 FROM 指令有关
# 如果 FROM 后的 --platform= 参数是 amd64,build 后的镜像也是 amd64,如果是 ARM,build 后也是 ARM
docker build -t image_name:image_tag .
# 创建一个 ARM 镜像
docker build --platform=linux/arm64 -t image_name:image_tag .
# 创建一个 amd64 镜像
docker build --platform=linux/amd64 -t image_name:image_tag .

如果你的 docker 镜像是部署到 x86/amd64 服务器,而本地电脑是 Apple Silicon,那在 build 的时候可以针对两个平台分别 build 一个版本,本地测试时运行 ARM 版本,部署到服务器时则选择 amd64 的版本。

一年后,即 2021 年 12 月,Docker Desktop 4.3.0 发布,这个版本不再强求电脑安装 Rosetta 2,在此之前要先安装 Rosetta 2。这里的 Rosetta 是用来转译 Docker Desktop 客户端的,而不是用来转译容器。

又过了大约一年,即 2023 年 1 月,Docker Desktop v4.16 发布,新增 Rosetta for x86/amd64 emulation,这时终于支持使用 Rosetta 而不是 QEMU 转译 x86/amd64 应用了。有些 x86/amd64 容器在 QEMU 下无法正常运行,开启 Rosetta 就可以了,比如 Crawlee,再比如 mssql-docker

截至到 v4.17.1,这个功能还在开发中,默认关闭,需要用户手动开启

docker-emulation

上面这个图表描述了 Docker Desktop 分别在 Apple Silicon 和 x86 电脑运行的模式。


相关文章:

donation赞赏
thumbsup0
thumbsdown0
暂无评论