Py学习  »  docker

如何构建多架构 Docker 镜像(ARM、x86 等)

运维狗工作日记 • 3 月前 • 89 次点击  

ZHDYA(七哥),9年互联网一线K8S从业者,专注分享K8S生态为主的实战经验,助力大家更高效、可靠地构建和管理容器!

近期更新:K8S架构、公有云、持久化存储、HELM、CICD、负载均衡、监控告警、可观察性、服务治理、AI探索等文章。

关注回复:“学习资料”,“面试资料”,获取惊喜!



在云原生与边缘计算爆发式增长的当下,跨平台镜像已成为现代开发者的刚需。

从x86云服务器到ARM边缘设备,从M1 Mac到国产化信创环境,开发者亟需一种能 自动生成多架构镜像 的标准化方案,以摆脱手动为每个硬件平台重复构建、测试、推送镜像的低效循环。

1)问题

如果尝试拉取不支持所有架构的 Docker 镜像,大概率会收到以下错误:

➜ docker pull zhdya/hey:latest

latest: Pulling from techiescamp/hey
no matching manifest for linux/arm64/v8 in the manifest list entries

在 Kubernetes 中,如果镜像不支持当前节点架构,会引发 ImagePullBackOff 错误。可以通过对 Pod 进行故障排除来检查是否。 为了解决这个问题,我们可以构建一个可以支持多种架构的 Docker 镜像。

2)使用 buildx 构建多架构 Docker 镜像

要构建多架构镜像,咱们需要使用名为 buildx 的 Docker 工具。

不必单独安装 Buildx,它在 MAC 和 Windows 上带有最新版本的 Docker Engine,在 Linux 中它带有最新的 Docker CLI 版本。

创建 Dockerfile,执行以下命令构建并推送多架构支持镜像。

docker buildx build \
  --platform linux/amd64,linux/arm64,linux/arm/v8 \
  -t zhdya/hey:latest \
  --push .
  1. docker buildx build
  • 作用:使用 Docker Buildx 插件进行镜像构建(传统 docker build 的增强版)。
  • 特点:支持多平台构建、缓存优化等高级特性。
  1. --platform linux/amd64,linux/arm64,linux/arm/v8
  • 作用:指定目标平台架构。
    • linux/amd64:64 位 x86 架构(常见 Intel/AMD 服务器/PC)。
    • linux/arm64:64 位 ARM 架构(如 Apple Silicon、树莓派 4B+)。
    • linux/arm/v8:ARMv8 架构(可能指 32 位 ARM,但通常 linux/arm64 更常见)。
  • 结果:会为每个平台生成独立的镜像层,并自动创建统一的 manifest 列表。
  1. --push
  • 作用:构建完成后直接推送镜像到远程仓库。
  • 对比:若省略此参数,镜像仅保存在本地(多平台构建时默认不保存到本地)。

3)验证&测试

Dockerfile:

# 使用多平台兼容的 Alpine 镜像作为基础
FROM --platform=$TARGETPLATFORM alpine:latest

# 示例:安装一个跨平台工具(如 curl)
RUN apk add --no-cache curl

# 示例:输出当前架构信息
RUN echo "Building for target platform: $TARGETPLATFORM"

# 设置容器启动时的默认命令
CMD ["echo""Hello, multi-architecture world!"]

创建支持多平台的构建器 & 编译:

docker buildx create \
  --name multi-platform-builder \  # 构建器名称
  --platform linux/amd64,linux/arm64,linux/arm/v8 \  # 指定支持的平台
  --driver docker-container \      # 使用容器驱动以实现跨平台构建
  --use                           # 创建后立即启用该构建器

docker buildx build \
  --platform linux/amd64,linux/arm64,linux/arm/v8 \
  -t zhdya/helloalpine:latest \
  --push .

验证环节,它显示了所有支持的作系统/架构,如下所示:

4)其他架构的支持

  • Linux/arm/v7 -> 32 位 ARM(较旧的 Raspberry Pi 设备)
  • linux/ppc64le -> 64 位 PowerPC Little Endian 用于 IBM 的某些系统。
  • linux/s390x -> IBM Z 和 LinuxONE 系统。
  • windows/amd64 -> 适用于 64 位 Windows 系统。
  • linux/riscv64 -> RISC-V 64 位。

●  🔥【实战】K8S云原生企业实战训练营课程大纲(直播+录播)

● ⚓【加薪】基于 Istio 的微服务架构实践总结

● 🏆【精华】基于Prometheus的全方位监控平台

● 🌟【Free】每天2分钟,跟我学Istio

● 🌟【Free】应用可观察性-APM

● 🌟【Free】负载均衡Ingress-nginx最佳实践

● 🌟【Free】基于Jenkins的CICD实战场景

● 🌟【Free】Helm企业场景从入门到精通

● 🌟【Free】K8S故障|经验|考题|手册

● 🌟【Free】基于K8S场景下存储持久化

● 🌟【Free】K8S基础架构讲解(面向企业真实场景)

● 😉加群】扫码,备注: 进群

● 关注回复“学习资料”,“面试资料”,获取惊喜!

关注七哥,带你领略不一样的K8S!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/182677
 
89 次点击