Docker Buildx 构建多系统架构镜像

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
无影云电脑企业版,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调用等
相关文章
|
19天前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
191 0
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
27天前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
29天前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
203 99
|
9天前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
192 43
|
8天前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
158 6
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
19天前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
29天前
|
传感器 人工智能 算法
分层架构解耦——如何构建不依赖硬件的具身智能系统
硬件与软件的彻底解耦,并通过模块化、分层的架构进行重构,是突破这一瓶颈、构建通用型具身智能系统的核心基石。这种架构将具身智能系统解耦为三个核心层级:HAL、感知决策层和任务执行层。这一模式使得企业能够利用预置的技能库和低代码工具快速配置新任务,在不更换昂贵硬件的前提下,实现从清洁机器人到物流机器人的快速功能切换。本文将通过对HAL技术原理、VLA大模型和行为树等核心技术的深度剖析,并结合Google RT-X、RobotecAI RAI和NVIDIA Isaac Sim等主流框架的案例,论证这一新范式的可行性与巨大潜力,探讨硬件解耦如何将机器人从一个“工具”升级为“软件定义”的“多面手”,从而
188 3
|
19天前
|
SQL 弹性计算 关系型数据库
如何用读写分离构建高效稳定的数据库架构?
在少写多读业务场景中,主实例读请求压力大,影响性能。通过创建只读实例并使用数据库代理实现读写分离,可有效降低主实例负载,提升系统性能与可用性。本文详解配置步骤,助你构建高效稳定的数据库架构。
|
5月前
|
关系型数据库 MySQL Docker
|
9月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
494 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结