多架构镜像

多架构镜像

什么是多架构镜像

多架构镜像(Multi-architecture Image)是指一个镜像 tag 下包含多个架构版本。当用户在 x86 机器上 pull 镜像时,Docker 自动下载 amd64 版本;在 ARM 机器上则自动下载 arm64 版本。

myapp:latest (manifest list)
  ├── linux/amd64 (sha256:abc...)
  ├── linux/arm64 (sha256:def...)
  └── linux/arm/v7 (sha256:ghi...)

多架构镜像的工作原理

OCI Image Index

多架构镜像基于 OCI Image Index(或 Docker Manifest List)规范。

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "platform": {"os": "linux", "architecture": "amd64"},
      "digest": "sha256:abc123..."
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "platform": {"os": "linux", "architecture": "arm64"},
      "digest": "sha256:def456..."
    }
  ]
}

pull 过程

# 用户只需
docker pull myapp:latest

# Docker 自动完成
# 1. 拉取 manifest list
# 2. 根据当前系统架构选择对应的 manifest
# 3. 拉取对应的镜像层

创建多架构镜像

方式一:Buildx(推荐)

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t registry.example.com/myapp:latest \
  --push .

方式二:手动合并 Manifest

# 分别构建
docker build --platform linux/amd64 -t myapp:amd64 .
docker build --platform linux/arm64 -t myapp:arm64 .

# 推送到仓库
docker push myapp:amd64
docker push myapp:arm64

# 创建 manifest list
docker manifest create myapp:latest \
  myapp:amd64 \
  myapp:arm64

# 推送 manifest list
docker manifest push myapp:latest

方式三:使用 manifest-tool

manifest-tool push from-spec manifest.yaml

验证多架构镜像

# 查看 manifest
docker manifest inspect myapp:latest

# 查看支持的架构
docker buildx imagetools inspect myapp:latest

输出:

Name:      docker.io/myapp:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:xyz...

Manifests:
  linux/amd64   digest: sha256:abc...
  linux/arm64   digest: sha256:def...

常见问题

Q1: 如何在特定架构上测试?

# 指定平台拉取
docker pull --platform linux/arm64 myapp:latest

# 指定平台运行
docker run --platform linux/arm64 myapp:latest uname -m

Q2: 旧版 Docker 不支持多架构怎么办?

# 需要手动指定架构 tag
docker pull myapp:latest-amd64
docker pull myapp:latest-arm64

Q3: 基础镜像验证

# 确认基础镜像支持哪些架构
docker buildx imagetools inspect node:18

面试要点

  1. 多架构镜像通过 OCI Image Index(Manifest List)实现一个 tag 多架构
  2. Docker 客户端会根据运行时 uname -m 自动选择合适的架构
  3. 推荐使用 Buildx 构建,手动 manifest 操作容易出错
  4. 老版本 Docker(< 18.06)不支持 manifest list 自动选择
  5. 国内公有云(阿里云 ACR、华为云 SWR)已全面支持多架构镜像

面试官常问:多架构镜像的底层存储结构是怎样的?客户端是怎么选择对应架构的?

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容