在x86_64机器上构建arm64镜像

有几种办法可以打包出arm64的镜像

直接在arm机器上执行编译和打包

通过qemu模拟arm环境

利用docker提供的buildx(需要启用试验性特性)

我没有arm的机器~,所以我主要试了一下下面两种方式。

借助qemu-user-static镜像打包
文档:https://github.com/multiarch/ qemu-user-static

开启arm平台支持

$ docker run --rm --privileged multiarch/qemu-user-static:register --reset

copy qemu-user-static 二进制到/usr/bin 目录

$ docker build --rm -t “test/integration/ubuntu” -<<EOF
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
FROM arm64v8/ubuntu
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
EOF

$ docker run --rm -t “test/integration/ubuntu” uname -m
aarch64

在运行qemu-user-static:register镜像的时候,就通过内核中的binfmt_misc机制注入了哪些可执行文件可以被识别。

注意:需要将qemu-aarch64-static文件 copy 到/usr/bin目录。


binfmt_misc是Linux内核说提供的一种扩展机制, 使得更多类型的文件得以成为"可执行"文件.Linux内核本身支持ELF、a.out、脚本(也就是上面所说的第一行#!指定解释器的方式)这集中"可执行文件".但它还提供了一个称为binfmt_misc的内核模块, 通过这个模块可以动态注册一些"可执行文件格式",注册之后我们就可以直接"执行"这个程序文件了.


通过buildx打包支持多架构的镜像
文档:https://docs.docker.com/buildx/working-with-buildx/

首先需要开启这个实验性的功能,怎么开启看这里:https://github.com/docker/cli/blob/master/experimental/README.md

docker cloent: 在~/.docker/config.json 加入``写入"experimental":“enabled”

dcoker daemon: 启动参数上加上–experimental或者/etc/docker/daemon.json写入"experimental": true

「进行初始化:」

docker buildx create --name builderx
docker buildx use builderx
docker buildx inspect --bootstrap #这一步会从外网拉取moby/buildkit镜像,貌似还改不了
「接下来你就可以通过如下命令去构建多种架构的镜像:」

docker buildx build --platform linux/amd64,linux/arm64 -f Dockerfile -t silenceper/reverse-proxy . --push
–push参数表示构建完成之后,并push到镜像仓库当中。

因为镜像仓库支持一个仓库上传多种架构,并且会根据构建平台pull相匹配架构的镜像,所以我们可以在一个Dockerfile,并且通过一个命令打包镜像并push。

这里用到的Dockerfile在这里:https://github.com/silenceper/reverse-proxy/blob/master/Dockerfile

「通过docker的多阶段构建将编译和打包放在一起了,隔离了环境的差异。」

FROM golang:alpine as builder
ADD . /go/src/github.com/silenceper/reverse-proxy/
RUN cd /go/src/github.com/silenceper/reverse-proxy/
&& go get -v
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine
MAINTAINER silenceper silenceper@gmail.com
COPY --from=builder /go/src/github.com/silenceper/reverse-proxy/app /bin/app
ENTRYPOINT ["/bin/app"]
EXPOSE 80
总结
最方便的肯定是直接通过buildx进行打包和编译,但是我的环境没法访问外网,又没法拉取外网的镜像,所以最终还是选择使用qemu-user-static打包出来了。

参考
https://blog.fleeto.us/post/buildx-and-osx/

https://juejin.im/post/5af86fb15188251b8015c102

https://www.cnblogs.com/bamanzi/p/run-x86-linux-progs-with-qemu-user-on-arm.html

<think>嗯,用户之前问了关于Loki和Promtail适配systemd版本的问题,现在又转向了AMD64ARM64x86_64的区别。可能用户是在搭建日志系统时遇到了硬件兼容性问题,或者是在选择服务器硬件架构时需要了解这些信息。需要先确定用户的实际需求,比如他们是否在部署到同的CPU架构上,或者在编译软件时需要选择正确的二进制包。 首先,AMD64x86_64其实是一样的,都是指64位的x86架构,由AMD最初提出,后来被Intel采用。而ARM64是基于ARM架构的64位版本,常见于移动设备和一些服务器,比如AWS的Graviton处理器。用户可能混淆了这些名称,需要明确区分它们的起源和应用场景。 接下来要考虑用户可能遇到的问题。例如,他们可能在下载软件时知道该选哪个版本,或者在构建多架构镜像时需要了解同架构的差异。需要解释每种架构的特点、性能、功耗以及典型应用场景,帮助用户根据自身需求选择合适的架构。 另外,用户可能对兼容性有疑问,比如x86_64的软件能否在AMD64运行,或者ARM架构的服务器是否适合他们的应用。需要说明指令集的差异导致软件需要专门编译,以及跨平台运行的可能解决方案,比如模拟器或容器技术。 还需要注意用户的技术背景。如果他们熟悉底层硬件,可能需要用更通俗的语言解释,避免过于专业的术语。同时,结合之前的日志系统问题,推测他们可能在部署Loki/Promtail时需要选择适合的架构版本,因此可以强调在下载这些工具时如何选择正确的架构包。 最后,检查是否有常见的误区需要澄清,比如混淆x86_64ARM64的适用场景,或者误以为所有64位架构都是兼容的。总结时给出明确的对比表格和典型应用示例,帮助用户快速决策。</think>以下是 **AMD64x86_64)与 ARM64** 的对比说明,涵盖架构设计、性能特点和应用场景: --- ### 一、核心区别总结 | **特性** | **AMD64/x86_64** | **ARM64** | |-----------------|---------------------------------|--------------------------------| | **指令集架构** | CISC(复杂指令集) | RISC(精简指令集) | | **功耗效率** | 较高功耗 | 低功耗,能效比高 | | **典型应用** | 服务器、PC、高性能计算 | 移动设备、嵌入式系统、云服务器 | | **软件生态** | 广泛兼容,主流操作系统支持 | 快速扩展,逐步覆盖服务器领域 | | **寄存器数量** | 16 通用寄存器 | 31 通用寄存器 | --- ### 二、详细对比 #### 1. **指令集与设计哲学** - **AMD64/x86_64**: - **CISC 架构**:单条指令可完成复杂操作(如内存读写与计算合并),硬件逻辑复杂。 - **历史背景**:由 Intel x86 架构扩展至 64 位(AMD 提出标准,后命名为 AMD64)。 - **兼容性**:完全兼容 32 位 x86 程序(通过硬件模拟层)。 - **ARM64**: - **RISC 架构**:指令精简、长度固定,依赖多指令组合完成复杂任务,硬件设计更简单。 - **模块化设计**:支持定制化扩展(如 NEON SIMD 指令加速多媒体处理)。 - **原生 64 位**:兼容传统 32 位 ARM 指令(需软件模拟层)。 #### 2. **性能与功耗** - **AMD64/x86_64**: - **高性能**:适合高负载计算(如科学模拟、数据库服务器)。 - **功耗**:典型 TDP 65W~250W(桌面/服务器级 CPU)。 - **ARM64**: - **能效比**:相同性能下功耗仅为 x86 的 1/3~1/2(例:Apple M1 芯片)。 - **散热需求低**:适合密集部署(如边缘计算节点、云计算集群)。 #### 3. **应用场景** - **AMD64/x86_64 主导领域**: ```bash # 典型场景 - 企业级服务器(AWS EC2、Azure 通用型实例) - 桌面操作系统(Windows/macOS/Linux PC) - 高性能计算(HPC、GPU 加速计算) ``` - **ARM64 新兴领域**: ```bash # 典型场景 - 移动设备(智能手机、平板电脑) - 云服务器(AWS Graviton、阿里云倚天实例) - 嵌入式/IoT(树莓派、无人机控制器) ``` --- ### 三、软件兼容性差异 #### 1. **操作系统支持** - **AMD64/x86_64**: - 全平台支持:Windows、Linux、macOS(Intel 芯片)。 - 无需特殊配置即可运行多数闭源商业软件(如 Adobe 套件、游戏)。 - **ARM64**: - **Linux**:原生支持完善(Ubuntu/Debian 等提供 ARM 版本)。 - **Windows**:Windows on ARM 支持有限(依赖 x86 模拟器,性能折损约 20%)。 - **macOS**:Apple Silicon(M1/M2)完全转向 ARM64,通过 Rosetta 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值