.. _docker_multi-platform_images:
=========================================
Docker多平台镜像(multi-platform images)
=========================================
Docker镜像可以支持多平台(multiple platforms),意味着单个镜像可能包含针对不同架构的变体(contain variants for different architectures),有时候还包含了针对不同的操作系统(例如Windows)的变体。
当运行一个支持多平台的镜像, ``docker`` 会自动选择匹配你的OS和架构的镜像。
大多数存储在Docker Hub的docker官方镜像都提供一系列架构。例如 ``busybox`` 镜像支持 ``amd64, arm32v5, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x`` 。当运行在 ``x86_64 / amd64`` 主机时,会自动下载和运行 ``amd64`` 。
构建多平台镜像
===============
采用 ``Buildx`` 的 ``BuildKit`` 可以为多平台构建镜像,而不会仅限于构建时用户恰好使用的体系结构和操作系统。
调用 ``build`` 的时候,可以设置 ``--platform`` 参数来指定构建输出的目标平台(例如, ``linux/amd64`` , ``linux/arm64`` 或者 ``darwin/amd64`` )。
如果当前构建实例的后端是采用 ``docker-container`` 驱动,则可以同时指定多个平台架构。此时,会构建一个清单列表,其中包含所有指定架构的镜像。这样,当使用 ``docker run`` 或者在docker服务中使用这个镜像时,Docker会自动根据节点的平台选择正确的镜像。
可以使用 ``Buildx`` 和 ``Dockerfiles`` 支持三种不同策略构建多平台镜像:
- 在内核中使用 QEMU 仿真支持
- 使用相同的bulder实例在多个原生节点构建
- 使用Dockerfile中的阶段交叉编译到不同的体系结构
.. note::
这里实践需要参考 :ref:`buildkit_startup` 进行
.. _docker_official_multi-platform_images:
Docker官方多平台镜像(Docker Official Images Architectures other than amd64)
----------------------------------------------------------------------------
官方镜像的Dockerfile格式使用类似如下:
参考
======
- `Building Multi-Arch Images for Arm and x86 with Docker Desktop `_
- `arm Developer: Getting started with Docker - Multi-architecture images `_ ARM官方开发指南中有关多架构镜像的构建
- `docker build: multi-platform images `_
- `Faster Multi-Platform Builds: Dockerfile Cross-Compilation Guide `_
- `Multi-Platform Docker Builds `_
- `Building Multiplatform Container Images the Easy Way `_