使用 docker buildx 构建多 CPU 架构镜像

简介:

使用 docker buildx 构建多 CPU 架构镜像

引言
在工作中,遇到了需要将应用程序打包成 Docker 镜像并同时运行在不同的 CPU 架构(X86 和 ARM)的环境中。

ARM 架构与 X86 相比,ARM 低功耗、移动市场占比高,X86 高性能、服务器市场占比高。

不同的 CPU 架构,对于运行相同的应用程序的 Docker 容器,需要分别在相应的 CPU 架构下编译的 Docker 镜像。
要构建多架构镜像,首先想到的是每种 CPU 架构环境(物理环境或虚拟环境)下构建相应的镜像。
但目前 docker 构建环境是 X86 的,没有 ARM 环境,
或者要申请 ARM 物理机,或者要申请/创建 ARM 虚拟机,或者交叉编辑等等,听上去都比较麻烦。

经过研究,发现 docker buildx 支持构建多架构镜像,这使得构建多架构镜像变得简单。
这样就可以在 X86 架构下构建 ARM 架构的镜像。

接下来,开始实践之旅吧。

环境
Docker Desktop(Mac)
Docker Engine 19.03+

实践步骤
第一步,开启 docker buildx
docker buildx 目前还是试验功能,默认没有开启,需要在 Docker Desktop 的首选项中开启它

Docker —>Preferences —>Command Line —> Enable experimental features

执行 docker buildx 命令,输出截图如下:

第二步,构建多架构镜像,并推送到 Docker Hub
写个简单的 Dockerfile,仅做演示:

echo "FROM python:3.7-alpine”>Dockerfile

列出 builder:

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker
  default default         running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
我们当前使用的是默认的 builder,它基本上是旧的 builder。
让我们创建一个新的 builder,它使我们能够访问一些新的多架构结构功能。

创建 builder:

$ docker buildx create --use --name mybuilder
mybuilder
查看 builder:

$ docker buildx inspect --bootstrap
[+] Building 18.8s (1/1) FINISHED
=> [internal] booting buildkit                                                                                                                                                                       18.8s
=> => pulling image moby/buildkit:buildx-stable-1                                                                                                                                                    18.0s
=> => creating container buildx_buildkit_mybuilder0                                                                                                                                                   0.7s
Name:   mybuilder
Driver: docker-container

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
构建多架构镜像,并推送到 Docker Hub:

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t donhui/multiarch --push .
该 --platform 标志指示 buildx 要为 Intel 64位、Arm 32位和 Arm 64位架构生成 Linux 镜像。
该 --push 标志生成一个多架构清单,并将所有镜像推送到 Docker Hub。

在 DockerHub 查看该镜像,latest tag 下有三个镜像,当在不同的架构 pull 该 tag 时会根据其环境 pull 相应架构的镜像:

思考与总结
实践中不断产生疑问,不断思考,不断求解,或许你也会有同样的问题:

1、多架构镜像对 docker 版本有何要求?

构建时要用到 docker buildx 命令,docker 版本需要 19.03+;

运行时 docker 版本不一定需要 19.03+,笔者使用 1.13.1 和 18.06.1 都可以 pull 多架构镜像的。

2、所有 Dockerfile 都可以构建成多架构吗?还是有什么要求?

对 Dockerfile 没有要求,任何 Dockerfile 无需修改。

3、镜像构建后默认保存在构建缓存中,如何将镜像保存在本地?

可以将 type 指定为 docker,但必须分别为不同的 CPU 架构构建不同的镜像,不能合并成一个镜像,如:

docker buildx build -t donghui/multiarch-armv7 --platform=linux/arm/v7 -o type=docker .
docker buildx build -t donghui/multiarch-arm64 --platform=linux/arm64 -o type=docker .
docker buildx build -t donghui/multiarch-amd64 --platform=linux/amd64 -o type=docker .
也可以将镜像 push 到镜像仓库后,再进行 pull。

4、只支持推送到 Docker Hub 吗?如果要推送到私有镜像仓库,对私有镜像仓库有什么要求?

也可以将镜像推送到私有镜像仓库,但需要该镜像仓库支持多架构镜像的功能。

如果要将多架构镜像推送到 Harbor,需要 Harbor 的版本为 v2.0.0。

Harbor v2.0.0 于 2020/05/13 发布,Harbor v2.0.0 完全支持多架构镜像。

Harbor v2.0.0 更新日志:https://github.com/goharbor/harbor/releases/tag/v2.0.0

参考
Container 爱上ARM

https://www.jianshu.com/p/64f0da7a044d

跨平台构建 Docker 镜像新姿势,x86、arm 一把梭

https://blog.csdn.net/alex_yangchuansheng/article/details/103146303

Getting started with Docker for Arm on Linux

https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/

Multi-arch build and images, the simple way

https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/

Building multi-platform images

https://github.com/docker/buildx#building-multi-platform-images

Building Multi-Arch Images for Arm and x86 with Docker Desktop

https://www.docker.com/blog/multi-arch-images/

原文地址https://my.oschina.net/donhui/blog/4283243

相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
6月前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
6月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
487 100
|
6月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
457 99
|
6月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
630 98
|
6月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
6月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
905 52
|
6月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
1746 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
713 6
|
5月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
531 2