一次性构建出多CPU指令集的 Docker 镜像

简介: 本文介绍了使用 Docker Buildx 构建跨平台 Docker 镜像的流程。首先确保系统为 Ubuntu 22.04,安装 Docker 和相关依赖。然后配置 Docker Buildx,编写 Go 程序和 Dockerfile。接着,创建构建脚本 `build.sh` 自动化构建并推送镜像到 Docker Hub。运行此脚本将为不同平台(如 amd64, arm64)构建并推送镜像。最后,在 Docker Hub 可查看构建结果,并可在其他系统上测试镜像。

简介

​ 本文介绍了如何使用 Docker Buildx 一次性构建不同平台架构的 Docker 镜像,并上传到 Docker Hub。通过简单的准备工作和构建脚本,我们可以轻松地实现跨平台的镜像构建和发布。

准备工作

系统版本

root@example:~# lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:    22.04
Codename:    jammy

root@example:~# uname -a 
Linux example 6.5.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Mar 12 10:22:43 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

docker环境
docker安装请参考阿里巴巴开源镜像站

root@example:~# docker version 
Client: Docker Engine - Community
 Version:           26.0.0
 API version:       1.45
 Go version:        go1.21.8
 Git commit:        2ae903e
 Built:             Wed Mar 20 15:17:48 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.0.0
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       8b79278
  Built:            Wed Mar 20 15:17:48 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

在开始之前,确保你的系统已经安装了以下工具:

  • qemu-user-static:用于在当前操作系统上运行其他架构的仿真器。
  • binfmt-support:用于解析不同系统的二进制文件,给内核执行,并返回执行结果给用户空间的进程。 你可以使用以下命令安装这些工具:
sudo apt install binfmt-support qemu-user-static

配置 Docker Buildx

首先,创建一个 Docker Buildx 构建器并启用:

sudo docker buildx create --name mybuilder
sudo docker buildx use mybuilder
sudo docker buildx inspect --bootstrap

编写 Go 程序

在开始构建之前,我们先编写一个简单的 Go 程序 main.go,内容如下:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println("Hello, Docker! Platform architecture:", runtime.GOARCH)
}

编写 Dockerfile

然后,编写 Dockerfile 用于构建 Go 程序的镜像:

FROM golang:1.17 AS builder

# 设置工作目录
WORKDIR /app

# 复制源代码到工作目录
COPY . .

# 编译可执行文件
RUN go mod init goDemo && go mod tidy && go build -o app .

准备构建脚本

编写一个构建脚本 build.sh,用于自动化构建不同平台架构的 Docker 镜像并推送到 Docker Hub:

#!/bin/bash

# 设置镜像仓库名称和标签
REPO="adcwb/builds"
TAG="latest"

# 获取所有平台架构
 PLATFORMS=$(sudo docker buildx ls | grep -oP '\blinux/\w+\b' | sort | uniq)

# 遍历所有平台架构并构建镜像
for platform in $PLATFORMS; do
    echo "Building image for platform: $platform"
    sudo docker buildx build -t ${REPO}:$(echo $platform | sed 's/\//-/g')-${TAG} --platform $platform . --push
done
Docker Buildx 是 Docker 的一个构建工具,它提供了一种更灵活和高效的方式来构建、打包和发布多平台架构的 Docker 镜像。以下是 Docker Buildx 的一些常用参数介绍:
  • --platform:指定目标平台架构,可以是单个平台或多个平台的逗号分隔列表。例如:--platform linux/amd64,linux/arm64
  • --builder:指定使用的构建器名称,可以是预先创建的构建器的名称。例如:--builder mybuilder
  • --file:指定 Dockerfile 的路径。默认为当前目录下的 Dockerfile。
  • --tag:指定镜像的标签。例如:--tag myimage:latest
  • --build-arg:传递构建参数给 Dockerfile。例如:--build-arg VAR_NAME=value
  • --output:指定输出格式。例如:--output type=image,push=true
  • --progress:设置构建过程中的输出进度格式。例如:--progress plain
  • --load:将构建的镜像导出到本地文件中。
  • --push:将构建的镜像推送到镜像仓库。
  • --no-cache:禁用构建缓存。
  • --allow:设置构建策略,允许或拒绝某些操作。例如:--allow=all

运行构建脚本

运行构建脚本即可开始构建不同平台架构的 Docker 镜像并推送到 Docker Hub:

注意:如需把镜像推送到现有仓库中,需要先进行登录

bash build.sh

构建过程如下所示,仅展示部分输出日志
image.png

查看构建结果

在 Docker Hub 上查看构建完成的镜像,并确认不同平台架构的镜像已经上传成功。
image.png

在其他系统上随机拉取镜像测试执行


$ sudo docker run --rm -it --platform linux/arm64 adcwb/builds:linux-arm64-latest 

Hello, Docker! Platform architecture: arm64
目录
相关文章
|
7天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
11天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
332 28
|
7天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
13天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
81 2
|
14天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
28 1
|
20天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
55 6
|
16天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
19天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
24 4
|
20天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
32 1
|
7天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。

热门文章

最新文章