Docker Buildx 构建多系统架构镜像

本文涉及的产品
无影云电脑企业版,4核8GB 120小时 1个月
无影云电脑企业版,4核8GB 120小时 1个月
资源编排,不限时长
简介: 董江,容器技术布道者及实践者,中国移动高级系统架构专家,曾担任华为云核心网技术专家,CloudNative社区核心成员,KubeServiceStack社区发起者,Prometheus社区PMC,Knative Committer,Grafana社区Contributer。 欢迎关注:https://kubeservice.cn/

Docker Buildx 构建多系统镜像

由于开发调试编译需要,需要编译amd64aarch64arm64等不同平台指令二进制;为了方便使用者,编译多系统平台架构

golang简单demo为例:

package main

import (
    "net/http"
    "os"
    "time"

    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("this is muti arch demo: GOARCH:" + os.Getenv("GOARCH")))
    })

    mux.Handle("/metrics", promhttp.Handler())

    s := &http.Server{
        Addr:           ":8080",
        Handler:        mux,
        ReadTimeout:    time.Second * 5,
        WriteTimeout:   time.Second * 5,
        MaxHeaderBytes: 1 << 20, // 1048576; 1MiB
    }
    s.ListenAndServe()
}
# Builder
FROM dongjiang1989/alpine:golang-1.18.8-alpine3.15 as builder

RUN mkdir -p /go/src/server

WORKDIR /go//src/server/

COPY main.go main.go
COPY vendor/  vendor/
COPY go.sum go.sum
COPY go.mod go.mod

RUN export GOPATH=/go/src
RUN export GO111MODULE=off

RUN  go build -a -ldflags "-linkmode external -extldflags -static" -o /demo-server main.go

# Server
FROM dongjiang1989/alpine:golang-1.18.8-alpine3.15

EXPOSE 8080

COPY --from=builder /demo-server /demo-server

ENTRYPOINT ["/demo-server"]

多平台架构需要使用docker buildx version

查看docker是否支持多架构编译:

dongjiang@MacBook Pro:buildx $ docker buildx create --use --name muti-builder --driver docker-container --buildkitd-flags --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host
muti-builder

dongjiang@MacBook Pro:buildx $ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT  STATUS   BUILDKIT PLATFORMS
muti-builder *  docker-container                   
  muti-builder0 desktop-linux    inactive          
default         docker                             
  default       default          running  20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux   docker                             
  desktop-linux desktop-linux    running  20.10.21 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

编译多架构镜像

dongjiang@MacBook Pro:buildx $ docker buildx build -t dongjiang1989/muti-arch-demo-server:latest --platform=linux/arm64,linux/amd64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6 .
[+] Building 0.7s (10/10) FINISHED                                                                                                                                   
 => [internal] load build definition from Dockerfile                                                                                                            0.0s
 => => transferring dockerfile: 540B                                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                 0.0s
 => CANCELED [linux/arm/v6 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                  0.7s
 => CANCELED [linux/ppc64le internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                 0.7s
 => CANCELED [linux/arm64 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                   0.7s
 => CANCELED [linux/riscv64 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                 0.7s
 => CANCELED [linux/s390x internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                   0.7s
 => CANCELED [linux/arm/v7 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                  0.7s
 => CANCELED [linux/amd64 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15                                                   0.7s
 => CANCELED [linux/386 internal] load metadata for docker.io/dongjiang1989/alpine:golang-1.18.8-alpine3.15  
......

check多架构镜像

dongjiang@MacBook Pro:muti-arch $ docker manifest inspect dongjiang1989/muti-arch-demo-server:latest
{
   
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:786d66907396720dc98cf332f9d59dc423c0a28791e1f63d4f002f7ebb73bb4c",
         "platform": {
   
            "architecture": "386",
            "os": "linux"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:2e97c5212297685386fa22b8155b75f4ac2f758705c253cbe6707a48a8011497",
         "platform": {
   
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:e41b2fad89dc900ef10376a82ab4fd70a0a739a04d57d96b2589f938eca99b83",
         "platform": {
   
            "architecture": "arm",
            "os": "linux",
            "variant": "v6"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:e8d64dfa17f80eb3cc7bf4ccc648c0136e40b507272de1151fcfc13534cddaa8",
         "platform": {
   
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:394e182faddaa3b168f9e976f88900623c51e561d808d951e32a08e037acf591",
         "platform": {
   
            "architecture": "arm64",
            "os": "linux"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:d2e537ab91efb65344017ec40142cc09aa2b615ee0ef11aa5d6a9bf897861430",
         "platform": {
   
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
   
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1679,
         "digest": "sha256:c1f25a3aa9744f8a00f533c736abad0d23eff5d32908b426b37387829f4122e0",
         "platform": {
   
            "architecture": "s390x",
            "os": "linux"
         }
      }
   ]
}

总结

  1. docker 需要 使用dockerx编译
  2. 编译平台需要支持qemu切换gcc
  3. 基础镜像也需要支持多架构
  4. Dockerfile编译指令中,不能写死GOARCHGOOS
  5. 业务代码中,需要支持多架构代码;比如syscall, os调用等
相关文章
|
9天前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
84 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
6天前
|
存储 弹性计算 SDN
企业级 ECS 集群的构建需要综合考虑多个因素,通过不断的比较和对比不同的方案,选择最适合企业自身需求和发展的架构。
【9月更文挑战第5天】在数字化商业环境中,构建企业级ECS(弹性计算服务)集群对提升业务稳定性、扩展性和性能至关重要。本文将比较传统物理服务器与ECS架构,分析云服务商选择(如AWS和阿里云)、实例配置(CPU/内存)、网络架构(SDN vs 传统)及存储方案(本地存储 vs 云存储),帮助企业根据自身需求选出最优方案,实现高效稳定的ECS集群部署。
37 18
|
9天前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
51 20
|
3天前
|
Java API 开发者
【Java模块化新飞跃】JDK 22模块化增强:构建更灵活、更可维护的应用架构!
【9月更文挑战第9天】JDK 22的模块化增强为开发者构建更灵活、更可维护的应用架构提供了强有力的支持。通过模块化设计、精细的依赖管理和丰富的工具支持,开发者可以更加高效地开发和管理应用,提高应用的性能和可维护性。
29 10
|
9天前
|
Docker 容器
Docker Hub镜像公共仓库使用
这篇文章介绍了如何使用Docker Hub公共仓库进行镜像的创建、上传、下载和管理。
107 8
|
6天前
|
前端开发 安全 JavaScript
构建高效Web应用:前后端分离架构的实践
【9月更文挑战第4天】在数字时代,Web应用已成为企业与用户互动的主要平台。本文将介绍如何通过前后端分离的架构设计来构建高效的Web应用,探讨该架构的优势,并分享实现过程中的关键步骤和注意事项。文章旨在为开发者提供一种清晰、高效的开发模式,帮助其在快速变化的市场环境中保持竞争力。
|
6天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
26 5
|
6天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
27 2
|
Linux Docker Windows
Docker概述:什么Docker如此特别,它是如何构建的
本文讲的是Docker概述:什么Docker如此特别,它是如何构建的,【编者的话】在上一系列介绍中,我们大体地介绍了CoreOS。在这个系列中我想介绍一下Docker。本文我们看一下为什么Docker如此特别,它是如何构建的。我们会从基本开始介绍,所以读者不必担心自己是刚接触Docker的。
1368 0
|
9天前
|
Ubuntu Linux pouch
Docker容器管理工具
文章介绍了Docker容器管理工具,以及早期使用的LXC容器管理工具,包括它们的安装、使用和相关技术特点。
38 10
Docker容器管理工具