关于 docker hub 上不同架构的镜像的疑问

2021-10-25 17:21:55 +08:00
 matenshi

最近要把应用打包到一个 arm 架构的服务器上运行,但是手头的电脑都是 x86_64 的。

上网查了一下,可以根据摘要下载镜像,方式是 docker pull name:tag@sha256:digest。想着直接把 arm 的镜像拉下来,应用扔进去,打包一下最后直接扔到服务器上就行了。

在我根据摘要把镜像下载之后,发现 tag 变成了空的,所以我顺手改了一下,又尝试运行了一遍,竟然可以运行。

镜像是 tomcat ,按理说用的 jdk 应该也是 arm 的,应该是不能跑的吧。这是为什么呢?

谢谢!

1645 次点击
所在节点    Docker
4 条回复
matenshi
2021-10-25 18:00:05 +08:00
补充一个镜像的信息
| REPOSITORY    | TAG  | DIGEST | IMAGE ID  |
| ---- | ---- | ---- | ---- |
| arm64v8/tomcat | 9.0.54-jre8-openjdk | none | 2a4d541aa065 |
| tomcat | none | sha256:eacda77cc58a597806a93f5cb23e8c48d62b8b874623b05e69e3bfcfe646d41a 2a4d541aa065 |

看了看启动日志,有条是:
25-Oct-2021 08:29:32.631 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: aarch64

搜了搜,这个 arm64 和 aarch64 好像是一回事
Zhuzhuchenyan
2021-10-25 20:30:38 +08:00
我理解你的问题是,为什么 x86 的 docker 可以直接运行 arm64 的 docker image ?

以 Docker Desktop 为例子,安装时会自动安装 qemu 依赖,不同架构的镜像靠的是 qemu 模拟,可以参考以下回答
https://stackoverflow.com/questions/66350893/why-macosx86-can-run-docker-arm-container-arm64v8-alpine/66435150#66435150

可以通过 docker manifest 来检查一个镜像的架构,比如
docker manifest inspect --verbose arm64v8/alpine

"platform": {
"architecture": "arm64",
"os": "linux",
"variant": "v8"
}
ampedee
2021-10-25 21:04:55 +08:00
楼上说的对,如果你用的是 docker 客户端,自带虚拟机,两种架构的镜像都能运行
matenshi
2021-10-25 23:58:11 +08:00
@Zhuzhuchenyan 谢谢解答,非常感谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/810419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX