x86 or amd平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
前言
因国产化趋势,新的信创环境CPU大部分使用ARM架构。因暂无arm环境,自己买 arm
平台的 CPU
,这个成本着实吃不消,于是尝试 x86
平台运行 arm
平台的容器来降本增效。
关于 docker 版本
docker
运行其他平台容器,需要使用--platform
参数来指定平台docker 19.03.9
及以上的版本才支持--platform
参数- 默认没有开启
--platform
参数,需要手动开启。
开启experimental 功能配置:
参考:https://199604.com/2865
查看是否开启 experimental 功能
--platform
参数需要 experimental
为 true
,通过下面的命令可以验证是否开启:
拉取一个 arm 平台的容器测试
如果不加
--platform
参数,默认拉取自己当前 CPU 平台的镜像如果本地有相同
tag
的镜像,只是平台不同的情况下,需要注意区分tag
,不然直接docker pull
就会覆盖掉之前的镜像,之前的镜像tag
会变为<none>
配置qemu-user-static依赖
注册可支持的架构解释器
不指定 CPU 平台,使用 register 来注册可支持的架构解析器
下载 qemu-aarch64-static
qemu-user-static
下载地址:https://github.com/multiarch/qemu-user-static/releases
运行一个 arm 平台的容器
在没有 qemu-user-static
的帮助下,单靠 --platform
参数是无法启动非本机平台的镜像的,如下:
需要启动容器时将 qemu-aarch64-static
带入到容器内
注意
qemu-aarch64-static
二进制文件的路径,可以自己归纳到指定的路径,只需要带入到容器内的 /usr/bin 目录下就好了
同理,参试其他cpu架构平台也是一样下载
qemu-xxxx-static
构建 一个 arm64 镜像
- 准备一个
Dockerfile
- 需要将
qemu-aarch64-static
带入到容器内的/usr/bin
目录下才可以实现构建 - 不然会返回
standard_init_linux.go:211: exec user process caused "no such file or directory"
这样的报错
Dockerfile
开始构建
构建完成后
方式二:使用buildx在x86机器上面编译arm64架构的Docker镜像
因为 Centos 7 的内核太老,使用buildx暂时不支持,只做记录
参考:
1.https://blog.yasking.org/a/docker-multi-arch-with-buildx.html
2.https://www.cnblogs.com/jinanxiaolaohu/p/17409839.html
参考
1.https://www.cnblogs.com/chen2ha/p/17180287.html