点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

在云时代,容器化已经成为一种事实,把软件产品打包、构建成 Docker 镜像是最基本、最关键的一步。在信创的大背景下,云环境中会存在 x86、arm 等不同的架构,所以在构建镜像时需要构建出多种架构的镜像,以适配不同架构的服务器。

在拉取 Docker 镜像时,会根据当前环境的架构自动拉取对应架构的镜像,如:在 x86 环境下拉取的镜像为 x86 架构的镜像,在 arm 环境下拉取的镜像为 arm 架构的镜像。(前提是,该镜像是多架构的镜像)

本文将针对基于 Docker Buildx 来构建多架构的镜像展开说明(一次构建多架构的镜像)。

1、buildx 安装

Docker Buildx 是一个 CLI 插件,它扩展了 Docker 命令,完全支持 Moby BuildKit 构建器工具包提供的功能。它提供与 docker build 相同的用户体验,具有许多新功能,例如创建作用域构建器实例和同时针对多个节点进行构建。

  1. 1. 下载 buildx 二进制文件。

    在 Github Release 页面(https://github.com/docker/buildx/releases/latest)下载最新的 buildx 二进制文件。

    根据您的操作系统选择对应的二进制文件。

  2. 2. buildx 复制到 Docker 对应目录。

    重命名下载的 buildx 二进制文件,并将其复制到您操作系统对应的目录:

    操作系统 二进制名称 目标文件夹
    Linux docker-buildx $HOME/.docker/cli-plugins
    MacOS docker-buildx $HOME/.docker/cli-plugins
    Windows docker-buildx.exe %USERPROFILE%\.docker\cli-plugins

    例如,我的 MacOS:

    xcbeyond@xcbeyonddeMacBook-Pro ~ % mv ~/Downloads/buildx-v0.7.1.darwin-arm64 ~/.docker/cli-plugins/docker-buildx
    xcbeyond@xcbeyonddeMacBook-Pro ~ % chmod +x ~/.docker/cli-plugins/docker-buildx

    注意:需对 buildx 二进制文件赋予权限,执行 chmod +x

  3. 3. 检查 buildx。

    执行 docker buildx version

    xcbeyond@xcbeyonddeMacBook-Pro ~ % docker buildx version
    github.com/docker/buildx v0.7.1 05846896d149da05f3d6fd1e7770da187b52a247

2、开启 binfmt_misc 来运行非本地架构的 Docker 镜像

如果您使用的是 Mac 或者 Windows 版本 Docker 桌面版,则可以跳过这个步骤,因为 binfmt_misc 默认开启。

如果使用的是其它平台,可使用 tonistiigi/binfmt 镜像进行安装:

docker run --privileged --rm tonistiigi/binfmt --install all

3、将默认 Docker 构建器切换为多架构构建器

默认情况下,Docker 会使用默认构建器,是不支持多架构构建。

为了构建多架构的镜像,需要创建新的支持多架构的构建器,需执行 docker buildx create --use

xcbeyond@xcbeyonddeMacBook-Pro % docker buildx create --use --name mybuilder
mybuilder

查看新的多架构构建器是否生效,需执行 docker buildx ls

xcbeyond@xcbeyonddeMacBook-Pro % docker buildx ls
NAME/NODE       DRIVER/ENDPOINT             STATUS   PLATFORMS
mybuilder *     docker-container                     mybuilder0    unix:///var/run/docker.sock inactive
desktop-linux   docker                               desktop-linux desktop-linux               running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default         docker                               default       default                     running  linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

4、构建多架构镜像

1. 编写测试程序。

为方便测试,用 Golang 写了一个简单的程序,并输出当前程序运行环境的架构信息:

package mainimport ("fmt""runtime"
)func main() {fmt.Printf("the current platform architecture is %s.\n", runtime.GOARCH)
}

2. 编写 Dockerfile。

编写该程序的 Dockerfile(https://xcbeyond.cn/blog/containers/build-multi-platform-images-best-practices/Dockerfile):

FROM xcbeyond/go-builder:1.16LABEL maintainer xcbeyondWORKDIR /appCOPY multi-arch-test.go /app
RUN go build -o multi-arch-test /app/multi-arch-test.goCMD ["./multi-arch-test"]

3. 构建多架构镜像。

通过命令 docker buildx build -t <image-name> --platform=linux/arm64,linux/amd64 . --push,构建一个支持 arm64 和 amd64 架构的多架构镜像,并推送至 Docker Hub:

(参数 --push 会自动将镜像推送到 Docker Hub,本地并不会保留该镜像。如果不想推送,则可去掉该参数。)

xcbeyond@xcbeyonddeMacBook-Pro build-multi-platform-images-best-practices % docker buildx build -t xcbeyond/multi-arch-test --platform=linux/arm64,linux/amd64 . --push
[+] Building 3105.4s (19/19) FINISHED
=> [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
=> => transferring dockerfile: 222B                                                                                                                                                                   0.0s
=> [internal] load .dockerignore                                                                                                                                                                      0.0s
=> => transferring context: 2B                                                                                                                                                                        0.0s
=> [linux/amd64 internal] load metadata for docker.io/xcbeyond/go-builder:1.16                                                                                                                        5.2s
=> [linux/arm64 internal] load metadata for docker.io/xcbeyond/go-builder:1.16                                                                                                                        4.9s
=> [auth] xcbeyond/go-builder:pull token for registry-1.docker.io                                                                                                                                     0.0s
=> [internal] load build context                                                                                                                                                                      0.0s
=> => transferring context: 40B                                                                                                                                                                       0.0s
=> [linux/amd64 1/4] FROM docker.io/xcbeyond/go-builder:1.16@sha256:ace56967e44e98b1a8c286ad97717c878650d0312ac3e69767234f766601d6fc                                                               2323.9s
=> => resolve docker.io/xcbeyond/go-builder:1.16@sha256:ace56967e44e98b1a8c286ad97717c878650d0312ac3e69767234f766601d6fc                                                                              0.0s
=> => sha256:6e1d20a8313edd44a36cb9198f4d11ac5eedb41d1faf5e8a33c5a0a5a25d2b92 85.80MB / 85.80MB                                                                                                    2318.7s
=> => sha256:6494e4811622b31c027ccac322ca463937fd805f569a93e6f15c01aade718793 54.57MB / 54.57MB                                                                                                      27.3s
=> => sha256:5b59121a0c3517cfd68aba8a3955cbb40ca12dd56db3317e3a17cf56131ca915 129.08MB / 129.08MB                                                                                                    77.1s
=> => sha256:cb5b7ae361722f070eca53f35823ed21baa85d61d5d95cd5a95ab53d740cdd56 10.87MB / 10.87MB                                                                                                      96.5s
=> => sha256:9b829c73b52b92b97d5c07a54fb0f3e921995a296c714b53a32ae67d19231fcd 5.15MB / 5.15MB                                                                                                         5.2s
=> => sha256:0e29546d541cdbd309281d21a73a9d1db78665c1b95b74f32b009e0b77a6e1e3 54.92MB / 54.92MB                                                                                                      61.0s
=> => extracting sha256:0e29546d541cdbd309281d21a73a9d1db78665c1b95b74f32b009e0b77a6e1e3                                                                                                              1.5s
=> => extracting sha256:9b829c73b52b92b97d5c07a54fb0f3e921995a296c714b53a32ae67d19231fcd                                                                                                              0.1s
=> => extracting sha256:cb5b7ae361722f070eca53f35823ed21baa85d61d5d95cd5a95ab53d740cdd56                                                                                                              0.3s
=> => extracting sha256:6494e4811622b31c027ccac322ca463937fd805f569a93e6f15c01aade718793                                                                                                              1.6s
=> => extracting sha256:6e1d20a8313edd44a36cb9198f4d11ac5eedb41d1faf5e8a33c5a0a5a25d2b92                                                                                                              1.9s
=> => extracting sha256:5b59121a0c3517cfd68aba8a3955cbb40ca12dd56db3317e3a17cf56131ca915                                                                                                              3.3s
=> => extracting sha256:2db41f0db9d9d9a1f49978ec31e8d187f491767e9b377f5ee121827c407e015e                                                                                                              0.0s
=> [linux/arm64 1/4] FROM docker.io/xcbeyond/go-builder:1.16@sha256:ace56967e44e98b1a8c286ad97717c878650d0312ac3e69767234f766601d6fc                                                               2187.3s
=> => resolve docker.io/xcbeyond/go-builder:1.16@sha256:ace56967e44e98b1a8c286ad97717c878650d0312ac3e69767234f766601d6fc                                                                              0.0s
=> => sha256:221ff675cd357b3b345da24f781791fc9b91066d687f9e928993aab31618d13d 99.63MB / 99.63MB                                                                                                      54.3s
=> => sha256:627b3401fb617535edd16e96bd5941ecea7fe10ce6087bd47707602cfc396c2b 81.01MB / 81.01MB                                                                                                     472.1s
=> => sha256:841dd868500b6685b6cda93c97ea76e817b427d7a10bf73e9d03356fac199ffd 54.67MB / 54.67MB                                                                                                    2084.9s
=> => sha256:aa9c5b49b9db3dd2553e8ae6c2081b77274ec0a8b1f9903b0e5ac83900642098 10.66MB / 10.66MB                                                                                                       6.2s
=> => sha256:ac9d381bd1e98fa8759f80ff42db63c8fce4ac9407b2e7c8e0f031ed9f96432b 5.14MB / 5.14MB                                                                                                         6.8s
=> => sha256:94a23d3cb5be24659b25f17537307e7f568d665244f6a383c1c6e51e31080749 53.60MB / 53.60MB                                                                                                      22.7s
=> => extracting sha256:94a23d3cb5be24659b25f17537307e7f568d665244f6a383c1c6e51e31080749                                                                                                              1.5s
=> => extracting sha256:ac9d381bd1e98fa8759f80ff42db63c8fce4ac9407b2e7c8e0f031ed9f96432b                                                                                                              0.1s
=> => extracting sha256:aa9c5b49b9db3dd2553e8ae6c2081b77274ec0a8b1f9903b0e5ac83900642098                                                                                                              0.2s
=> => extracting sha256:841dd868500b6685b6cda93c97ea76e817b427d7a10bf73e9d03356fac199ffd                                                                                                              1.5s
=> => extracting sha256:627b3401fb617535edd16e96bd5941ecea7fe10ce6087bd47707602cfc396c2b                                                                                                              1.7s
=> => extracting sha256:221ff675cd357b3b345da24f781791fc9b91066d687f9e928993aab31618d13d                                                                                                              2.7s
=> => extracting sha256:10c716f05a00666c190fb40f99503dc83b2886de744ab9b3dc6c5d37d01f6e49                                                                                                              0.0s
=> [auth] xcbeyond/go-builder:pull token for registry-1.docker.io                                                                                                                                     0.0s
=> [linux/arm64 2/4] WORKDIR /app                                                                                                                                                                     0.1s
=> [linux/arm64 3/4] COPY multi-arch-test.go /app                                                                                                                                                     0.0s
=> [linux/arm64 4/4] RUN go build -o multi-arch-test /app/multi-arch-test.go                                                                                                                          0.3s
=> [linux/amd64 2/4] WORKDIR /app                                                                                                                                                                     0.2s
=> [linux/amd64 3/4] COPY multi-arch-test.go /app                                                                                                                                                     0.0s
=> [linux/amd64 4/4] RUN go build -o multi-arch-test /app/multi-arch-test.go                                                                                                                          1.5s
=> exporting to image                                                                                                                                                                               774.4s
=> => exporting layers                                                                                                                                                                               10.5s
=> => exporting manifest sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2                                                                                                      0.0s
=> => exporting config sha256:628f504898973d1d935ffd37993d1db5fdc4715c5d58467db2c6531d3d7d3181                                                                                                        0.0s
=> => exporting manifest sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd                                                                                                      0.0s
=> => exporting config sha256:47e7af533f821be5ba256919303e0de3b39990109a419a98dbfddc6c82086822                                                                                                        0.0s
=> => exporting manifest list sha256:8417543ebc47e6040a67a392d6ee9de05735ed464e48b22fcc3bdf66ce22224b                                                                                                 0.0s
=> => pushing layers                                                                                                                                                                                761.8s
=> => pushing manifest for docker.io/xcbeyond/multi-arch-test:latest@sha256:8417543ebc47e6040a67a392d6ee9de05735ed464e48b22fcc3bdf66ce22224b                                                          2.0s
=> [auth] xcbeyond/multi-arch-test:pull,push token for registry-1.docker.io                                                                                                                           0.0s
=> [auth] xcbeyond/multi-arch-test:pull,push token for registry-1.docker.io                                                                                                                           0.0s
=> [auth] xcbeyond/multi-arch-test:pull,push token for registry-1.docker.io                                                                                                                           0.0s

5、测试多架构镜像

将构建的多架构镜像 xcbeyond/multi-arch-test:latest 进行测试,以确保能够正常运行,并使用对应架构镜像能够输出匹配的架构信息。

  1. 1. 查看每个架构镜像的信息。

    执行命令 docker manifest inspect,可查看该镜像清单,并能得知该镜像对应架构的镜像 SHA 值:

    xcbeyond@xcbeyonddeMacBook-Pro build-multi-platform-images-best-practices % docker manifest inspect xcbeyond/multi-arch-test:latest
    {"schemaVersion": 2,"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json","manifests": [{"mediaType": "application/vnd.docker.distribution.manifest.v2+json","size": 2419,"digest": "sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2","platform": {"architecture": "arm64","os": "linux"}},{"mediaType": "application/vnd.docker.distribution.manifest.v2+json","size": 2420,"digest": "sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd","platform": {"architecture": "amd64","os": "linux"}}]
    }

    也可以直接在 Docker Hub 上直接看到该镜像支持的多架构信息:

  2. 2. 根据不同架构镜像的 SHA 值,来逐一运行该镜像,并查看其输出结果。

    分别执行 docker run --rm 命令:

    arm 架构的镜像:

    xcbeyond@xcbeyonddeMacBook-Pro build-multi-platform-images-best-practices % docker run --rm xcbeyond/multi-arch-test:latest@sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2
    Unable to find image 'xcbeyond/multi-arch-test:latest@sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2' locally
    docker.io/xcbeyond/multi-arch-test@sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2: Pulling from xcbeyond/multi-arch-test
    94a23d3cb5be: Pull complete
    ac9d381bd1e9: Pull complete
    aa9c5b49b9db: Pull complete
    841dd868500b: Pull complete
    627b3401fb61: Pull complete
    221ff675cd35: Pull complete
    10c716f05a00: Pull complete
    15bae122089f: Pull complete
    d764b5be0a55: Pull complete
    34bfa57028a2: Pull complete
    Digest: sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2
    Status: Downloaded newer image for xcbeyond/multi-arch-test@sha256:f38420339c9665b4f7d8b1e5edc66dc09e596ec7aa78113914b8a5b1b900e9e2
    the current platform architecture is arm64.

    x86 架构的镜像:

    xcbeyond@xcbeyonddeMacBook-Pro build-multi-platform-images-best-practices % docker run --rm xcbeyond/multi-arch-test:latest@sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd
    Unable to find image 'xcbeyond/multi-arch-test:latest@sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd' locally
    docker.io/xcbeyond/multi-arch-test@sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd: Pulling from xcbeyond/multi-arch-test
    0e29546d541c: Pull complete
    9b829c73b52b: Pull complete
    cb5b7ae36172: Pull complete
    6494e4811622: Pull complete
    6e1d20a8313e: Pull complete
    5b59121a0c35: Pull complete
    2db41f0db9d9: Pull complete
    f708bf6a9dc8: Pull complete
    cb0d69b97354: Pull complete
    a8f5aa83ecfb: Pull complete
    Digest: sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd
    Status: Downloaded newer image for xcbeyond/multi-arch-test@sha256:a259302dca0d3f432d08f578e3243c5244bc50e54ea561c80dba03622897fcfd
    the current platform architecture is amd64.

    上面的输出结果,和我们的期望一致:多架构的镜像构建成功,并能在各自架构环境下运行。

6、总结

多架构镜像是基于 Docker Buildx 构建的,目前 buildx 还需额外安装,未来 buildx 很可能成为 docker build 命令的一部分,无需额外安装,毕竟多架构镜像已在各种场景中应用广泛起来了。

参考文章:

  1. https://docs.docker.com/buildx/working-with-buildx/

  2. https://www.youtube.com/watch?v=hWSHtHasJUI


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

  • 盘点 2021 | 云原生拥抱之路

  • 云原生微服务技术趋势解读

  • 利用 Github Pages 和 Hugo 快速搭建免费的个人网站

  • MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

  • 微服务架构下的核心话题 (三):微服务架构的技术选型

喜欢就点个"在看"呗,留言、转发朋友圈

构建多架构镜像的最佳实践相关推荐

  1. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着 Prometheus 逐渐成为云原生时代的可观测事实标准,那么今天为大家带来在微服务架构下基于 Prometheus 构建一体 ...

  2. 生产中的12种容器镜像扫描最佳实践

    现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...

  3. 基于ECI+FaaS构建游戏战斗结算服最佳实践

    简介:在游戏行业的很多游戏类型中,尤其是SLG,为了防止客户端作弊,在每局战斗之后,在客户端预判玩家胜利的情况下,需要服务端来进行战斗数据的结算,从而确定玩家是不是真正的胜利.战斗结算是强CPU密集型 ...

  4. docker 根据标签删除镜像_10 个 Docker 镜像安全最佳实践

    <Docker 镜像安全最佳实践速查表[1]>列举了 10 个诀窍和指南,确保更安全和更高质量的 Docker 镜像处理.此外,还可以检视有关 Docker 安全的新报告<Docke ...

  5. Docker容器镜像安全最佳实践指南

    文章目录: 0x02 Docker 容器安全最佳实践 1.主机安全配置 1.1 更新docker到最新版本 1.2 为容器创建一个单独的分区 1.3 只有受信任的用户才能控制docker守护进程 1. ...

  6. 构建企业私有云的最佳实践

    构建企业私有云的最佳实践 作为全球计算创新领域的领先厂商,英特尔在中国大力推进计算创新.近年来,英特尔除了在微处理器.芯片组.服务器.存储系统及软件等方面有重大的突破,也在云计算.大数据和企业移动化应 ...

  7. 软件架构中的架构模式和最佳实践:探索和实践

    作者:禅与计算机程序设计艺术 "架构"这个词汇一直是软件工程师们谈论的热点话题之一,无论从代码设计.框架选型.需求分析.项目管理.测试策略还是后续的维护.运维等各个方面都离不开架构 ...

  8. 微服务架构10条最佳实践

    转载自公众号:SpringForAll社区 确保你在分布式系统中,努力实现这些微服务的最佳实践,例如监控和REST成熟度. 使用微服务架构可以解决所有的软件架构的问题,对吗?当然,这是不对的.但是,使 ...

  9. AIOps 落地难?仅需9步构建一套 AIOps 的最佳实践

    我在与客户交流 AIOps 的时候,他们时常觉得 AIOps 不够成熟,以至于无法实施各种分析. 也有人认为:AIOps 的各项能力是线性发展的,他们必须事先评估和补足当前在"处理大量的事件 ...

最新文章

  1. 防Xss攻击,包含富文本编辑器的处理
  2. java B2B2C 源码多租户电子商城系统-Spring Cloud组件详解
  3. Android移动开发之【Android企业级项目实战教程】DAY1-图表库HelloCharts
  4. hihocoder #1388 : Periodic Signal NTTFFT
  5. 烧了1.18亿美元融资后,谷歌GV投资的无人机公司宣布倒闭
  6. 把字母排序ASC表c语言,c语言ASCII码排序
  7. android gpu 编程,Android设备上的GPU编程
  8. 怎样呵护友谊_呵护友谊需要学会尊重对方.PPT
  9. SLAM_2021_F-LOAM:基于激光雷达的快速里程计和建图
  10. Verilog描述——一位全加器,四选一选择器,计数器
  11. 服务器集群虚拟化区别,服务器集群与虚拟化
  12. 几点减几点怎么列算式_时间加减法怎么算
  13. PS 使用画笔修复工具去除文字
  14. 阿里云 企业邮箱域名解析(DNS)
  15. 吃什么怎么吃关系着民族的命运
  16. 用计算机做路由器,用笔记本做无线路由(笔记本电脑当无线路由器用怎么设置)...
  17. 华为策略路由加等价路由_思科华为路由器如何利用route-map配置双wan口策略路由...
  18. 主动触控笔_如何自定义表面笔触控笔
  19. vivado2019.1开启代码补全和相同代码高亮
  20. 中国移动电商APP用户活跃度

热门文章

  1. 用python画出漂亮的地日模型(围绕太阳转地球)
  2. ThreeJS教程:地图案例(包围盒、正投影)
  3. Jonny Mo的读书笔记——《完成任务不找借口》之二
  4. 计算机网络技术专业的英文名称,计算机网络技术专业,computer network major,音标,读音,翻译,英文例句,英语词典...
  5. Redis主从复制的配置并进行场景测试
  6. 大数据分析工程师入门--1.Java基础
  7. 华为P7 Root方法
  8. bpmn camunda版转为activiti版
  9. HTML/CSS中如何保留页面中的空格?
  10. 使用Fragment兼容Tablet和Handset