一次性构建出多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
目录
相关文章
|
1月前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
20天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
5天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
21 3
docker push推送自己搭建的镜像
|
21天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
42 9
|
21天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
21天前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
42 4
|
25天前
|
存储 人工智能 编译器
【AI系统】CPU 指令集架构
本文介绍了指令集架构(ISA)的基本概念,探讨了CISC与RISC两种主要的指令集架构设计思路,分析了它们的优缺点及应用场景。文章还简述了ISA的历史发展,包括x86、ARM、MIPS、Alpha和RISC-V等常见架构的特点。最后,文章讨论了CPU的并行处理架构,如SISD、SIMD、MISD、MIMD和SIMT,并概述了这些架构在服务器、PC及嵌入式领域的应用情况。
53 4
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
下一篇
DataWorks