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

简介: 本文主要为大家讲解使用 docker buildx 构建多 CPU 架构镜像的过程。

1.png
镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

一、概述

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

不同的 CPU 架构,对于运行相同的应用程序的 Docker 容器,需要分别在相应的 CPU 架构下编译的 Docker 镜像。

传统的构建多架构镜像的方法又比较麻烦,所以接下来将为大家介绍如何使用 docker buildx 构建多架构镜像。通过在 X86 架构下构建 ARM 架构的镜像的方式,使得构建多架构镜像变得更简单。

二、环境

  • Docker Desktop(Mac)
  • Docker Engine 19.03+

2.png

三、操作步骤

1. 开启 docker buildx

docker buildx 目前还是试验功能,默认没有开启,需要在 Docker Desktop 的首选项中开启它
Docker —>Preferences —>Command Line —> Enable experimental features
3.png
执行 docker buildx 命令,输出截图如下:
4.png

2. 构建多架构镜像,并推送到 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。
5.png
在 DockerHub 查看该镜像,latest tag 下有三个镜像,当在不同的架构 pull 该 tag 时会根据其环境 pull 相应架构的镜像:
6.png

四、思考与总结

实践中不断产生疑问,不断思考,不断求解,或许你也会有同样的问题:
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

原文链接

阿里巴巴开源镜像站 提供全面,高效和稳定的镜像下载服务。钉钉搜索 ' 21746399 ‘ 加入镜像站官方用户交流群。”

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
3月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
568 51
|
3月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
773 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
463 5
|
2月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
374 2
|
3月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
3月前
|
传感器 人工智能 算法
分层架构解耦——如何构建不依赖硬件的具身智能系统
硬件与软件的彻底解耦,并通过模块化、分层的架构进行重构,是突破这一瓶颈、构建通用型具身智能系统的核心基石。这种架构将具身智能系统解耦为三个核心层级:HAL、感知决策层和任务执行层。这一模式使得企业能够利用预置的技能库和低代码工具快速配置新任务,在不更换昂贵硬件的前提下,实现从清洁机器人到物流机器人的快速功能切换。本文将通过对HAL技术原理、VLA大模型和行为树等核心技术的深度剖析,并结合Google RT-X、RobotecAI RAI和NVIDIA Isaac Sim等主流框架的案例,论证这一新范式的可行性与巨大潜力,探讨硬件解耦如何将机器人从一个“工具”升级为“软件定义”的“多面手”,从而
546 3
|
3月前
|
SQL 弹性计算 关系型数据库
如何用读写分离构建高效稳定的数据库架构?
在少写多读业务场景中,主实例读请求压力大,影响性能。通过创建只读实例并使用数据库代理实现读写分离,可有效降低主实例负载,提升系统性能与可用性。本文详解配置步骤,助你构建高效稳定的数据库架构。
|
4月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
305 16
|
4月前
|
Ubuntu 网络安全 PHP
如何使用vscode的Docker插件管理ubuntu 拉取服务器的镜像以及创建容器
本测试镜像旨在记录使用vscode的Docker插件拉取病创建Dockerfile,以及拉取镜像。