Docker Buildx构建多平台镜像的实现

目录
  • 写在前边
  • 构建环境
  • 启用BuildX
  • 安装qemu-user-static
  • 通知Docker使用qemu
  • 创建Buildx构建容器
  • 调整Dockerfile接收平台相关参数
  • 同时构建X86_64与ARM64镜像
  • 写在最后

写在前边

记录一下前阵子在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)传输到合适的平台上运行。

写在最后

本文简易地创建了多平台镜像构建环境,更多相关Docker Buildx构建多平台镜像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker构建镜像的两种方式实现

    目录 从已有镜像更新镜像: 从零开始构建镜像: 从 docker 镜像仓库中下载的镜像不能满足我们的需求时,可以通过以下两种方式对镜像进行更改. 从已有镜像更新镜像 从零开始构建镜像 从已有镜像更新镜像: 更新镜像之前,我们需要使用镜像来创建一个容器. 进入容器: docker run -t -i db2b37ec6181 /bin/bash 在运行的容器内使用 apt-get update 命令进行更新.在完成操作之后,输入 exit 命令来退出这个容器. 此时 ID 为 0aab061e6f

  • docker通过Dockerfile构建mysql镜像的方法

    构建Dockerfile ,路径 /docker/mysql FROM hub.c.163.com/library/mysql:5.7 #作者信息 MAINTAINER hu "***@qq.com" #修改编码方式 RUN echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf RUN service mysql restart EXPOSE 3306 到Docker

  • Docker镜像多架构构建介绍

    前言: 目前arm系统越来越常见,对镜像的多架构需求也越来越大.对于同一个镜像,最简单的办法就是在amd64或arm机器上build后通过不同的tag进行区分,比如 nginx:v1-amd64 . nginx:v1-arm64 ,但这种方式比较丑陋,而且没有对应架构的机器用来构建怎么办? 目前最新的办法就是使用buildx来进行构建,不过这个特性目前默认是没启用的,需要在docker的配置文件中添加 "experimental": true 后重启docker服务生效. 首先执行下面

  • Dockerfile文件编写及构建镜像命令解析

    目录 指令解析 简单的Dockerfile文件 Build命令添加dockerfile参数 构建镜像 构建容器并端口映射启动 镜像上传到远程镜像仓库 部署 指令解析 FROM # 基于什么镜像 WORKDIR # 指定工作路径,没有就创建目录 ------ COPY # 拷贝,文件地址 ADD # 拷贝,也可以是文件地址,也可以是url网络资源 ------ RUN # 运行shell语句 ------ ENTRYPOINT 1.运行容器时,执行的脚本.可以是json数据指定,也可以是shell

  • 关于构建aarch64环境Mysql8.0的Docker镜像问题

    目录 1. 获取构建mysql镜像的脚本 2.预先下载gosu-arm64.gosu-arm64.asc ,并放到mysql/8.0目录下 3.修改Dockerfile.oracle,使用本地下载的gosu 4.执行构建Docker镜像 1. 获取构建mysql镜像的脚本 git clone https://github.com/docker-library/mysql.git 2.预先下载gosu-arm64.gosu-arm64.asc ,并放到mysql/8.0目录下 wget -c ht

  • Jenkins构建Docker镜像并推送至Harbor仓库的实现

    目录 Dockerfile文件 pom.xml Jenkins配置 ​ spring boot项目通过Jenkins集成构建Docker镜像推送到harbor仓库并启动容器然后拉取镜像到本地运行容器 Dockerfile文件 位置:存在根目录下,与src同级 FROM java:8 # 作者 MAINTAINER zhaoyc VOLUME /tmp #ARG JAR_FILE #将jar包添加到容器中并更名为app.jar ADD target/*.jar app.jar RUN bash -

  • dockerfile指令构建docker镜像的示例代码

    目录 初识Dockerfile 编写一个自己的docker 镜像: DockerFile docker build . 命令 查看镜像是如何生成的 初识Dockerfile Dockerfile就是用来构建docker镜像的构建文件!命令脚本! 通过这个脚本可以生成镜像,镜像是一层层的,脚本是一行行的命令,每行命令都是一层 dockerfile是面向开发的,我们以后要发布项目,作镜像,就需要编写dockerfile文件,这个文件十分简单. Dockerfile镜像之间成为了企业交付的标准,必须掌

  • Docker Buildx构建多平台镜像的实现

    目录 写在前边 构建环境 启用BuildX 安装qemu-user-static 通知Docker使用qemu 创建Buildx构建容器 调整Dockerfile接收平台相关参数 同时构建X86_64与ARM64镜像 写在最后 写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker 20.10.16 Ubuntu 和 Fedora 安装构建环境比较方便,

  • Docker buildx构建多平台镜像并推送到私有仓库的方法

    引子 最近发现有ARM版Docker,hub.docker.com上也有ARM版本的镜像,但是ARM版本的Docker镜像构建是个问题.嵌入式程序可以在PC机上进行交叉编译,不知道Docker是否有交叉构建的方案. 方案 目前想到的Docker构建ARM镜像方法有如下几种.第三种就类似交叉编译. 使用ARM主机,安装ARM版本的Docker,docker build出来的就是ARM版本的镜像. 使用Linux的虚拟化软件,模拟ARM芯片+ Linux,例如qemu. 使用Docker试验功能bu

  • Docker Gitlab+Jenkins+Harbor构建持久化平台操作

    CI/CD概述 CI工作流程设计 Git 代码版本管理系统 只能命令行去管理git Gitlab 基于git做了图形管理页面,企业使用gitlab做私有的代码管理仓库 Github 公共代码管理仓库 搭建gitlab 搭建gitlab先创建工作目录,因为有些数据需要持久化 [root@www ~]# mkdir -p /gitlab [root@www ~]# cd /gitlab/ docker run -d \ --name gitlab \ -p 8443:443 \ -p 9999:80

  • docker搭建jenkins+maven代码构建部署平台

    目录 Docker基本概念 Docker安装过程(Centos6.9) 升级内核 安装docker-io 基于Docker的jenkins安装 拉取应用 运行容器 跟踪应用log 关闭打开容器 tomcat账户配置 配置jenkins,构建部署war应用 配置JDK.Maven等参数 新建任务构建部署 通过ssh脚本部署maven项目到指定Tomcat中 配置Publish Over SSH插件 编写部署ssh脚本 项目构建配置 由于项目开发,经常需要在本地搭一些环境进行开发或测试,大家知道搭环

  • docker 手动构建新镜像的方法

    本文介绍了docker 手动构建新镜像的方法,分享给大家,具体如下: 查看本地现有镜像: [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c59f17fe53b0 4 days ago 108MB ubuntu latest 747cb2d60bbe 3 weeks ago 122MB centos latest 196e0ce0c9fb 6 weeks ago 197MB 现在利用

  • 使用Docker构建企业级自定义镜像的方法

    前言 临下班前,楼主接到了一个需求,由于基础镜像标准发生变更,需要按照最新的Docker 镜像标准构建自己应用的自定义镜像.目前的标准是这样的:基础架构组只提供所有项目必须接入的3个公共镜像,这3个公共基础镜像包含了:JDK8.Skywalking.Arthas.对于各自业务组的应用如果还需要加入其它镜像,则由各个业务组自己基于基础架构组提供的公共镜像之上,再添加自定义的镜像,结构图如下: 构建步骤 编写Dockerfile 基于最新的规范来看,我们需要编写一个Dockerfile,然后引用基础

  • 使用Docker构建一个Git镜像使用clone仓库

    概述 使用docker已经有一年多了,最近意识到,我在快速编排服务的时候,shell脚本里用到的git还是原生的 于是打算也将git容器化,在dockerhub上搜罗了一筐,找到这个镜像下载量比较高 进去看了dockerfile后,感觉不太适合需求 这里没有提供卷,也没有提供ssh,既不能把仓库映射到宿主机,也没有提供clone私有仓库的功能(小声bb:都可以做到,但是不方便).其他的gitclient镜像也都大同小异. 只能自己造个轮子了. 镜像地址 本文的镜像以push到dockerhub,

  • docker中Dockerfile方式建立镜像HelloWorld

    Dockerfile可以便捷的建立一个image,它可以在一个镜像基础上,去构建另一个镜像,这也许就是它的特色,也是docker的本意! 我们下载一个mono的镜像 docker pull mono 然后,我们在本地磁盘去建立一个Dockerfile文件,让它在这个mono基础上,去输出一个helloword和mono的版本信息 FROM mono CMD mono --version #CMD echo "hello world !" #多条CMD只执行最后一条 我们现在通过dock

  • win7环境下Docker快速构建及阿里云容器加速配置详解

    上篇Docker中提到的是MAC系统中的构建,本篇会简单介绍win7中Docker的构建和加速. 下载之前的步骤本文中不再重提,直接去Docker官网中下载win7版本进行安装,安装完成之后系统会多了三个启动包, 1."Kitematic (Alpha)" Docker服务管理器及更新检查器 Kitematic (Alpha)启动后就是上图的界面,用于管理Docker服务和版本更新等工作.纯视图工作端,可以进行对Docker进行服务重启等. 2."Docker Quickst

  • rancher下的kubernetes之构建标准化vmware镜像的方法步骤

    学习kubernetes的时候,我们需要在kubernetes环境下实战操作,然而kubernetes环境安装并不容器,现在通过rancher可以简化安装过程,咱们来实战rancher下的kubernetes吧: 整个实战分为两章:<构建标准化vmware镜像>和<安装部署rancher.kubernetes> 前提条件 由于要用到谷歌的服务,所以要求您的网络环境可以科学上网,具体的方案就不在这里说了: 实战环境 本次实战用的电脑是win10家庭版,通过vmware运行三个ubun

随机推荐