Docker 镜像跨架构迁移指南

41 阅读2分钟

1. 需求背景

当在无代理的环境因网络问题不方便拉取某些docker镜像时候,可以在有代理的环境拉取需要的镜像,再上传到需要的环境。

此时在本地(如 Apple Silicon M1/M2/M3 Mac)导出镜像并在 x86 架构服务器上运行时,可能会遇到 exec format error。这是因为架构不匹配导致的。本指南介绍如何正确打包指定架构的镜像。


2. 本地环境:拉取并导出正确架构镜像

在你的 本地电脑 (Mac/PC) 上执行以下操作。关键在于使用 --platform 参数强制指定目标服务器的架构。

本文 以nginx作为示例


第一步:拉取 x86_64 镜像

强制拉取适用于 Intel/AMD 架构的镜像:

# 拉取 nginx 服务器镜像
docker pull --platform linux/amd64 nginx:latest

第二步:保存为 Tar 文件

将镜像保存为 tar 文件:

# 将镜像保存为 tar 文件
docker save nginx:latest > nginx-x86.tar

3. 服务器环境:加载与验证

在你的 x86_64 服务器 上执行以下操作。

加载新镜像

将本地生成的 .tar 文件上传至服务器后运行:

# 加载镜像
docker load < nginx-x86.tar

架构验证(关键)

检查加载后的镜像架构是否确认为 amd64:

docker image inspect nginx:latest | grep Architecture

预期输出:

"Architecture": "amd64"

4. 启动容器

现在你可以正常使用nginx 镜像了,Docker 不会再尝试联网拉取;解决了无代理情况下镜像使用。


5. 常见问题排查

为什么不加 --platform 也会拉取成功?

Docker 默认会下载与当前宿主机匹配的架构。在 Mac M1 上默认下载 ARM64,在 Intel 服务器上默认下载 AMD64。跨机迁移必须手动指定。

服务器空间不足?

加载完镜像后,可以删除 .tar 文件以节省空间:

rm *.tar

Error response from daemon: unable to create manifests file: NotFound: ...

在 执行 docker save ... 的时候可能报错:Error response from daemon: unable to create manifests file: NotFound: content digest sha256:378f275f52cbbc5cebdf84b5c4fe51544f28e698e05db75588a82d4cfeb44542: not found

此时解决方法如下

使用的是较新版本的 Docker Desktop,可能开启了 "Use containerd for pulling and storing images" 选项。这个选项有时会导致 inspect 结果异常。

 1. 点击 Docker 图标 -> Settings -> General;

 2. 查看 "Use containerd for pulling and storing images" 是否勾选;

 3. 尝试: 如果勾选了,请取消勾选并重启 Docker,然后重新 pull;

 4. 然后再执行接下来的步骤,即可正常。