前言
在不同操作系统和处理器架构上运行应用是很普遍的场景,因此为不同平台单独构建发布版本是一种常见做法。当我们用来开发应用的平台与部署的目标平台不同时,实现这一目标并不容易。例如在 x86 架构上开发一个应用程序并将其部署到 ARM 平台的机器上,通常需要准备 ARM 平台的基础设施用于开发和编译。
一次构建多处部署的镜像分发大幅提高了应用的交付效率,对于需要跨平台部署应用的场景,利用docker buildx 构建跨平台的镜像也是一种快捷高效的解决方案。
大部分镜像托管平台支持多平台镜像,这意味着镜像仓库中单个标签可以包含不同平台的多个镜像,如图
通过 docker pull 或 docker run 拉取一个支持跨平台的镜像时,docker 会自动选择与当前运行平台相匹配的镜像。由于该特性的存在,在进行镜像的跨平台分发时,我们不需要对镜像的消费做任何处理,只需要关心镜像的生产,即如何构建跨平台的镜像。
docker buildx
- 启用 Buildx
macOS 或 Windows 系统的 Docker Desktop,以及 Linux 发行版通过 deb 或者 rpm 包所安装的 docker 内置了 buildx,不需要另行安装 - buildx 构建方式
docker buildx build .
buildx 和 docker build 命令的使用体验基本一致,还支持 build 常用的选项如 -t、-f等 - 查看docker buildx版本
docker buildx version
docker buildx builder
Buildx 允许创建独立的builder。该环境不会更改共享守护程序的状态,或者用于隔离不同项目的构建
- 查看当前的builder实例
docker buildx ls
- 创建新的builder实例
docker buildx create --name [NAME]
- 切换到指定的builder实例
docker buildx use [NAME]
- 检查当前builder实例确保该实例已经启动
docker buildx inspect [NAME] --bootstrap
- 停止builder实例
docker buildx stop [NAME]
- 删除builder实例
docker buildx rm [NAME]
docker buildx demo
docker login
在dockerhub创建对应的Repository
-
创建一个builder实例
docker buildx create --name lilqbuilder docker buildx use lilqbuilder docker buildx ls docker buildx inspect lilqbuilder --bootstrap docker buildx ls
-
clone 一个demo 项目
git clone git@github.com:quan930/Multi-ArchitectureImagesDemo.git cd Multi-ArchitectureImagesDemo
build images
docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm/v6,linux/s390x -t lilqcn/multi-architecture-demo:v1 --push .
-
验证
- 使用
docker buildx imagetools
检查镜像
docker buildx imagetools inspect lilqcn/multi-architecture-demo:v1
- 使用特定的SHA标记的镜像(amd64)
docker run --rm lilqcn/multi-architecture-demo:v1@sha256:32b0f902d8ba557665cab930d2f6e94ee0bf23004ca8e7e5ed80638cf47a1c87 uname -m
- 使用