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. ...
随机推荐
- python基础练习题(题目 求输入数字的平方,如果平方运算后小于 50 则退出)
day32 --------------------------------------------------------------- 实例046:打破循环 题目 求输入数字的平方,如果平方运算后 ...
- OpenHarmony 3.1 Beta版本关键特性解析——分布式DeviceProfile
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 成翔 OpenAtom OpenHarmony(以下简称"OpenHarmony")作为分布式操作 ...
- python学习Day21
目录 今日内容详细 作业讲解 os模块 知识点进修 创建目录(文件夹) 删除目录(文件夹) 查看某个路径下所有的文件名称(文件.文件夹) 删除文件.重命名文件 获取当前路径.切换路径 软件开发目录规范 ...
- Halo 开源项目学习(七):缓存机制
基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...
- CTFHub-HTTP协议五关刷题解答
CTFHub 开箱即用的CTF学习解决方案 地址:https://www.ctfhub.com/#/skilltree 本次解答一共包括五关,没有先后顺序. 1.技能树一:请求方式 题目描述 打开后得 ...
- 是时候使用 YAML 来做配置或数据文件了
概述 我们做程序,经常需要用到配置信息,回顾一下这么多年的搬砖生涯,我记得用过多种格式的文件来定义配置信息,例如 ini文件,xml文件,或者现在比较流行的 json 文件. 这些年虽然云计算和云原生 ...
- nodejs使用 svg-captcha 做验证码及验证
一.需求 使用 nodejs 做后端开发,需要请求验证码,在 github 上看到了 svg-captcha 这个库,发现他是将 text 转 svg 进行返回的,安全性也有保证,不会被识别成文字. ...
- Python <算法思想集结>之抽丝剥茧聊动态规划
1. 概述 动态规划算法应用非常之广泛. 对于算法学习者而言,不跨过动态规划这道门,不算真正了解算法. 初接触动态规划者,理解其思想精髓会存在一定的难度,本文将通过一个案例,抽丝剥茧般和大家聊聊动态规 ...
- 聊聊OOP中的设计原则以及访问者模式
一 设计原则 (SOLID) 1. S - 单一职责原则(Single Responsibllity Principle) 1.1 定义 一个类或者模块只负责完成一个职责(或功能), 认为&qu ...
- Java实现http大文件流读取并批量插入数据库
1.概述 请求远程大文本,使用流的方式进行返回.需要设置http链接的超时时间 循环插入到List中,使用mybatis-plus批量插入到mysql中 2.需求 两台服务器 大文件放到其中一台服务器 ...