一次性构建出多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
目录
相关文章
|
18天前
|
应用服务中间件 Linux nginx
Docker镜像-手动制作yum版nginx镜像
这篇文章介绍了如何手动制作一个基于CentOS 7.6的Docker镜像,其中包括下载指定版本的CentOS镜像,创建容器,配置阿里云软件源,安装并配置nginx,自定义nginx日志格式和web页面,最后提交镜像并基于该镜像启动新容器的详细步骤。
79 21
Docker镜像-手动制作yum版nginx镜像
|
18天前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
94 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
1天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
18天前
|
应用服务中间件 Linux nginx
Docker镜像管理篇
关于Docker镜像管理的教程,涵盖了Docker镜像的基本概念、管理命令以及如何制作Docker镜像等内容。
88 7
Docker镜像管理篇
|
18天前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
60 20
|
6天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
8天前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
18天前
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
301 8
|
22天前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
22天前
|
前端开发 应用服务中间件 nginx
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建