Docker Buildx 构建多系统架构镜像

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
简介: 董江,容器技术布道者及实践者,中国移动高级系统架构专家,曾担任华为云核心网技术专家,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调用等
相关文章
|
1月前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
1月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
351 51
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
357 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
19天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
173 5
|
19天前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
210 2
|
1月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
1月前
|
传感器 人工智能 算法
分层架构解耦——如何构建不依赖硬件的具身智能系统
硬件与软件的彻底解耦,并通过模块化、分层的架构进行重构,是突破这一瓶颈、构建通用型具身智能系统的核心基石。这种架构将具身智能系统解耦为三个核心层级:HAL、感知决策层和任务执行层。这一模式使得企业能够利用预置的技能库和低代码工具快速配置新任务,在不更换昂贵硬件的前提下,实现从清洁机器人到物流机器人的快速功能切换。本文将通过对HAL技术原理、VLA大模型和行为树等核心技术的深度剖析,并结合Google RT-X、RobotecAI RAI和NVIDIA Isaac Sim等主流框架的案例,论证这一新范式的可行性与巨大潜力,探讨硬件解耦如何将机器人从一个“工具”升级为“软件定义”的“多面手”,从而
306 3
|
1月前
|
SQL 弹性计算 关系型数据库
如何用读写分离构建高效稳定的数据库架构?
在少写多读业务场景中,主实例读请求压力大,影响性能。通过创建只读实例并使用数据库代理实现读写分离,可有效降低主实例负载,提升系统性能与可用性。本文详解配置步骤,助你构建高效稳定的数据库架构。

热门文章

最新文章