Docker Buildx 构建多系统架构镜像

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
无影云电脑个人版,1个月黄金款+200核时
无影云电脑企业版,8核16GB 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调用等
相关文章
|
2月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
199 0
|
3月前
|
存储 SQL 分布式计算
19章构建企业级大数据平台:从架构设计到数据治理的完整链路
开源社区: 贡献者路径:从提交Issue到成为Committer 会议演讲:通过DataWorks Summit提升影响力 标准制定: 白皮书撰写:通过DAMA数据治理框架认证 专利布局:通过架构设计专利构建技术壁垒
|
2月前
|
小程序 安全 JavaScript
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
117 1
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
|
2月前
|
数据采集 存储 分布式计算
一文读懂数据中台架构,高效构建企业数据价值
在数字化时代,企业面临数据分散、难以统一管理的问题。数据中台架构通过整合、清洗和管理数据,打破信息孤岛,提升决策效率。本文详解其核心组成、搭建步骤及常见挑战,助力企业高效用数。
|
2月前
|
消息中间件 缓存 负载均衡
构建高效可扩展的后端架构:从设计到实现
本文探讨了如何构建高效、可扩展的后端架构,涵盖需求分析、系统设计、实现与优化全过程。内容包括微服务、数据库设计、缓存与消息队列等关键技术,并涉及API设计、自动化测试、CI/CD及性能优化策略,助力打造高性能、易维护的后端系统。
|
9月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
10月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
233 3
|
5月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
320 12