x86 环境下借助 qemu-user-static 跨平台运行与构建 arm64 Docker 镜像的实践指南

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

1. 为什么我们需要在x86电脑上运行ARM容器?

最近几年,我身边不少在金融、证券行业做技术的朋友,都开始跟我聊一个词:“信创”。说白了,就是国产化替代。这意味着,他们未来开发和部署应用的服务器,很可能从我们熟悉的Intel或AMD的x86芯片,换成基于ARM架构的国产CPU,比如华为的鲲鹏。

这本来是个好事,但问题来了:我们这些开发者,手头清一色都是x86的笔记本电脑和开发机。难道为了测试一个在ARM服务器上跑的Docker应用,就得先去买一台几万块的ARM服务器?这成本,无论是个人还是团队,都很难吃得消。更别提日常的CI/CD流水线构建、本地功能测试了,总不能每次都去占用宝贵的生产或测试环境资源吧。

这时候,一个强大的工具就进入了我们的视野:qemu-user-static。简单来说,它就像一个“实时翻译官”。我们的x86系统只能理解x86的指令,而ARM容器里的应用说的是ARM指令,两者鸡同鸭讲,自然跑不起来。qemu-user-static的作用,就是在运行时,把ARM指令“翻译”成x86指令,让我们的x86系统能听懂并执行。虽然这种翻译会带来一些性能损耗(毕竟多了一道工序),但对于开发、测试、构建镜像这些场景来说,完全够用,关键是成本几乎为零!

所以,今天我就把自己在x86环境下折腾qemu-user-static,实现arm64 Docker镜像运行和构建的实战经验,毫无保留地分享出来。你会发现,整个过程并没有想象中那么复杂,跟着步骤走,半小时内就能搞定,让你手上的x86机器瞬间获得“跨平台”的超能力。

2. 前期准备:搞定Docker的实验性功能

工欲善其事,必先利其器。我们要做的第一件事,就是确保你的Docker版本足够新,并且开启了一个关键功能。

2.1 确认Docker版本

Docker从19.03版本开始,才引入了对多平台架构(Multi-arch)的原生支持。我们后面要用到的 --platform 参数就依赖于此。所以,先打开终端,检查一下你的Docker版本:

docker --version

我建议你的版本至少是 Docker 20.10.0 或以上。如果版本太老,可以去Docker官网下载安装最新版本。升级Docker通常没什么风险,但记得备份一下重要的容器和数据。

2.2 开启Experimental功能

接下来是关键一步。Docker的多平台构建和运行支持,在早期被归类为“实验性功能”。虽然现在已经很稳定了,但默认还是关闭的。我们需要手动打开它。

首先,检查当前是否已经开启:

docker info | grep -i experimental

如果返回 Experimental: false 或者什么都没有,那就说明没开。如果已经是 true,恭喜你,可以跳过这一步。

开启的方法很简单,修改Docker的守护进程配置文件 daemon.json。这个文件通常位于:

  • Linux: /etc/docker/daemon.json
  • macOS: 在Docker Desktop的配置界面里设置更简单(我们稍后说)。
  • Windows: 同样建议使用Docker Desktop的GUI配置。

对于Linux系统,如果文件不存在,就创建一个;如果存在,就在现有内容里添加一行。用你喜欢的编辑器(比如vim或nano)打开它:

sudo vim /etc/docker/daemon.json

在JSON对象里,加入 "experimental": true。你的文件内容可能看起来像这样(注意JSON格式,末尾不能有逗号):

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "experimental": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

这里有个我踩过的坑:JSON格式非常严格,最后一个属性后面不能有逗号。如果你添加的 "experimental": true 是最后一个属性,前面记得加逗号,但它自己后面不能有。很多编辑器的JSON插件能帮你自动格式化。

保存文件后,重启Docker服务让配置生效:

sudo systemctl restart docker

再次运行 docker in

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值