Docker Buildx使用教程:使用Buildx构建多平台镜像
写在前边
记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像。
构建环境
软件名 | 版本 |
---|---|
Ubuntu | 18.04.2 LTS |
Docker | 20.10.16 |
Ubuntu 和 Fedora 安装构建环境比较方便,没有内核版本低导致的一系列问题。如果想使用CentOS请参考其他文档。
启用BuildX
Docker Buildx 是 Docker的CLI插件,来自于Moby BuildKit 。自从Docker 18.06 开始这个插件直接集成到了Docker build 中,直至成文之日,它仍处于Experimental状态,所以想使用它需要显式地开启它。
启用 Buildx 有两种方式:
临时激活:在执行构建命令前添加环境变量,如
DOCKER_BUILDKIT=1 docker buildx build -t 镜像:标签 --platform linux/arm64 .
配置文件激活:
vim /etc/docker/daemon.json
#添加配置
{
"experimental": true
}
安装qemu-user-static
qemu-user-static 用来模拟多平台环境,它依赖于binfmt-support,所以这两者都要安装。
sudo apt install -y qemu-user-static binfmt-support
通知Docker使用qemu
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
创建Buildx构建容器
#创建构建容器
docker buildx create --name mybuilder
#buildx使用构建容器
docker buildx use mybuilder
#初始化构建容器
docker buildx inspect --bootstrap
当初始化成功,会拉下来moby/buildkit:buildx-stable-1的镜像,并启动构建容器。通过 docker ps 查看如下:
root@hz:~# docker ps
root@hz:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba6651e07ab0 moby/buildkit:buildx-stable-1 "buildkitd" 5 weeks ago Up 50 minutes buildx_buildkit_mybuilder0
调整Dockerfile接收平台相关参数
为确保构建容器能拉取到正确平台的基础镜像,可显式在FROM后指定平台参数
TARGETPLATFORM
或BUILDPLATFORM
,由buildx自动传递。
FROM --platform=$TARGETPLATFORM 基础镜像名:TAG
.... 其他内容
同时构建X86_64与ARM64镜像
构建并直接推送到指定仓库
docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/amd64,linux/arm64 . --push
构建并导出到本地Docker images中
docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/arm64 . --load
注意那个点,是构建上下文位置为当前目录的意思。另外导出到本地只能构建一个镜像,本地不支持同时导出manifest lists。
导出的镜像如果与当前运行环境平台不同,是无法直接启动的,可以导出(
docker save
)传输到合适的平台上运行。
写在最后
本文简易地创建了多平台镜像构建环境,如果对你有所帮助,欢迎点赞、评论、关注。
我是 Hellxz,过些日子再见!
Docker Buildx使用教程:使用Buildx构建多平台镜像的更多相关文章
- 使用 buildx 构建多平台 Docker 镜像
原文链接:使用 buildx 构建多平台 Docker 镜像 在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上.特别是 D ...
- Docker教程:镜像构建和自动镜像构建dockerfile
http://blog.csdn.net/pipisorry/article/details/50805379 Docker透过Dockerfile来记录建立Container映象文件的每一个步骤,可 ...
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- Docker最全教程之使用Tencent Hub来完成CI(九)
使用Tencent Hub来完成CI 关于Tencent Hub Tencent Hub是腾讯出品的DevOps服务.主要提供多存储格式的版本管理,支持Docker Image.Binary.Helm ...
- Docker最全教程——从理论到实战(八)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(七)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(六)
托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅. 自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...
- Docker最全教程——从理论到实战(五)
往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...
- Docker最全教程——从理论到实战(四)
往期内容链接 https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608. ...
随机推荐
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...
- @Transactional的使用与失效
@Transactinonal 注解在方法抛出RuntimeException类及其子类时.Error类及其子类时会回滚当前事务,使sql不提交: 只能作用于public的方法:写在类上时,代表给该类 ...
- 攻防世界-MISC:2017_Dating_in_Singapore
这是MISC高手进阶区的题目:题目如下: 点击下载附件一,得到一张pdf图片,除此之外就只有题目给的字符串了,不知道是什么意思(查看了一下WP)原来每一串通过"-"隔开的字符串代表 ...
- 一篇文章教你搞懂日志采集利器 Filebeat
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 本文使用的Filebeat是7.7.0的版本,文章将从如下几个方面说明: Filebeat是什 ...
- c++:-4
上一节学习了C++的数组,指针和字符串,c++:-3.本节学习C++的继承与派生: 继承 继承和派生的关系 继承与派生是同一过程从不同的角度看 保持已有类的特性而构造新类的过程称为继承 在已有类的基础 ...
- FinOps for Kubernetes - 如何拆分 Kubernetes 成本
本文独立博客阅读地址:https://thiscute.world/posts/finops-for-kubernetes/ 目录 云计算成本管控 Kubernetes 成本分析的难点 Kuberne ...
- 百度SEO算法技术的局限性,怎么做才能有收益
不知道大家有没有发现,我们使用百度的频率在减少,就算有时遇到一些问题,需要用百度来寻找答案,也会经常遇到搜索不到答案的情况.到底是出了什么问题?难道网络上的资源不够丰富了?浩如烟海的互联网,居然搜索不 ...
- SpringBoot从0到0.7——第一天
SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...
- Vue报错: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'protocol')
Vue报错: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'protocol') 报错信 ...
- k8s中应用GlusterFS类型StorageClass
GlusterFS在Kubernetes中的应用 GlusterFS服务简介 GlusterFS是一个可扩展,分布式文件系统,集成来自多台服务器上的磁盘存储资源到单一全局命名空间,以提供共享文件存储. ...