在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像。该命令支持 --platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。

安装模拟器

Docker for Linux 不支持构建 arm 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。

docker run --rm --privileged tonistiigi/binfmt:latest --install all

新建 builder 实例

由于 Docker 默认的 builder 实例不支持同时指定多个 --platform,所以必须先创建一个新的 builder 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 镜像加速地址 的 dockerpracticesig/buildkit:master 镜像替换官方镜像。

 
# 适用于国内环境
 
docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
   
 
# 官方默认
 
docker buildx create --name mybuilder --driver docker-container

上面新建了一个名为 mybuilder 的实例,可以使用 docker buildx ls 查看

使用新创建好的 builder 实例

docker buildx use mybuilder

新建 Dockerfile 文件

以下是一个示例的 Dockerfile 文件,用于构建自定义 Nginx 容器镜像:

 
FROM --platform=$TARGETPLATFORM nginx
 
LABEL org.opencontainers.image.authors="Kinoko"
   
 
RUN apt update \
 
&& apt install cron -y \
 
&& curl https://get.acme.sh | sh -s email=admin@example.com \
 
&& ln -s /root/.acme.sh/acme.sh /usr/bin/acme.sh \
 
&& chmod +x /usr/bin/acme.sh \
 
&& acme.sh --upgrade --auto-upgrade
   
 
EXPOSE 80 443
 
USER root

$TARGETPLATFORM 是内置变量,由 --platform 参数来指定其值。

由于是基于 nginx 镜像制作,nginx支持以下7种系统架构,因此我们制作的镜像也就跟着支持这 7 种系统架构。

linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x

如果基础镜像来源于不同的镜像,可以先将不同的基础镜像进行重命名,使用统一的前缀和不同的 tag 来区分,然后在 Dockerfile 中使用变量 TARGETARCH 来选择不同的基础镜像。

构建镜像

使用 docker buildx build 命令构建镜像,注意将 myusername 替换为自己的 Docker Hub 用户名。$TARGETPLATFORM 是内置变量,由 --platform 参数来指定其值。

 
docker buildx build --platform linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x -t myusername/nginx:tag . --push
 
docker buildx imagetools inspect myusername/nginx:tag

--push 会将构建好的镜像推送到镜像仓库

--load 会将构建好的镜像load到本地,不支持多镜像一起使用,需要分开构建

参考

  1. 使用 buildx 构建多种系统架构支持的 Docker 镜像
  2. 使用 Docker Buildx 构建多种系统架构镜像

Docker 使用 buildx 构建多种系统架构支持的镜像的更多相关文章

  1. 使用 buildx 构建多平台 Docker 镜像

    原文链接:使用 buildx 构建多平台 Docker 镜像 在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上.特别是 D ...

  2. 使用 Spring Cloud 和 Docker 构建微服务架构

    如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...

  3. Docker Buildx使用教程:使用Buildx构建多平台镜像

    写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...

  4. Kubernetes的系统架构与设计理念

    Kubernetes与云原生应用简介 随着Docker技术的发展和广泛流行,云原生应用和容器调度管理系统也成为IT领域大热的词汇.事实上,云原生应用的思想,在Docker技术火爆之前,已经由云计算技术 ...

  5. 千万pv大型web系统架构,学习从点滴开始

     架构,刚开始的解释是我从知乎上看到的.什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像.更抽象一点,说架构其 ...

  6. Android系统架构说明介绍

    Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...

  7. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  8. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  9. Android进阶加密-第1章-Android系统架构-读书笔记

    第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...

  10. Android系统架构及内核简介

    (来源于ThinkPHP) Android是Google公司开发的基于Linux平台的开源手机操作系统,它包括操作系统.中间件.用户界面和应用程序,而且不存在任何以往阻碍移 动产业创新的专利权障碍,并 ...

随机推荐

  1. linux overlay文件系统

    一个 overlay 文件系统包含两个文件系统,一个 upper 文件系统和一个 lower 文件系统,是一种新型的联合文件系统.overlay是"覆盖-上面"的意思,overla ...

  2. 105份墨天轮“国产化迁移”干货文档汇总(含TiDB、openGauss、上云等)

    当前国产数据库产品百花齐放,随着政策的推进.技术的迭代以及市场需求的逐步扩大,数据库国产化正在加速进行中,有越来越多的金融.通信.制造.互联网等企业机构以及政府机关单位将业务系统从Oracle.MyS ...

  3. iOS中UIlabel多行文本展示使用小结

    最近在项目开发中遇到了一个新的需求,就是菜单标题最多两行展示,一行展示的标签顶部和两行展示的标签顶部对齐.看到要求后,第一反应是这是什么奇葩的设计,但是没办法谁让别人是产品经理呢.细细思索后,代码如下 ...

  4. C++ 第一节课 名字空间 ,输入输出函数,和 C 语言的区别

    #include <iostream> // #include 头文件,C++标准库的头文件都不带 .h (.h 是C库头文件添加的) #include <cstdio> #i ...

  5. WSL默认安装目录

    我当前在win11下进行以下操作,其它系统版本有问题可以留言 一.安装WSL 前提条件:我们需要保证你的操作系统版本满足 **Windows 10 版本 2004 及更高版本(内部版本 19041 及 ...

  6. Fluent Operator 2.5.0 发布:新增多个插件

    日前,Fluent Operator 发布了 v2.5.0. Fluent Operator v2.5.0 新增 11 个 features, 其中 Fluent Bit 新增支持 7 个插件, Fl ...

  7. linux 基础(8)例行任务

    我们的 linux 系统,有时会自动进行线上更新,会定时升级locate用到的数据库.用户也会"在每天0点备份数据"或者"每天8点分析登录文件",管理这些例行任 ...

  8. 温习 SPI 机制 (Java SPI 、Spring SPI、Dubbo SPI)

    SPI 全称为 Service Provider Interface,是一种服务发现机制. SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时 ...

  9. Java Z 垃圾收集器如何彻底改变内存管理

    大家好,我是 V 哥,今天的内容来聊一聊 ZGC,Java Z Garbage Collector(ZGC)是一个低延迟垃圾收集器,旨在优化内存管理,主要用于大内存应用场景.它通过以下几个关键创新,彻 ...

  10. Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解

    title: Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解 date: 2024/11/5 updated: 2024/11/5 author: cmdr ...