需求背景
某项目提供的环境是基于容器的,无法使用 docker on docker
来运行服务了,所以需要从现有的arm版本容器镜像中提取出指定文件来直接运行
方案分析
短时间购买服务器不太现实,再就是原镜像比较大,大约有 16G,购买一台ARM云主机部署可行,但是上传文件的时间成本不低
所以第二个方案是尝试在现有的X86服务器上运行ARM版本的容器镜像,经过初步的检索,这个方案貌似可行
安装步骤
实现这个需求,主要是通过 qemu 模拟 ARM
来实现,参考文档
https://github.com/multiarch/qemu-user-static/
- 安装依赖
# 前提已经安装了 docker,这里直接安装 qemu 相关的依赖包
yum install -y \
qemu-system-arm qemu qemu-user qemu-kvm qemu-kvm-tools libvirt virt-install \
libvirt-python libguestfs-tools-c
- 运行容器
docker run --rm --privileged multiarch/qemu-user-static --reset
# 这个命令会设置宿主机相关配置,让后续ARM相关的程序能够解释执行
$ cat /proc/sys/fs/binfmt_misc/qemu-$arch
enabled
interpreter /usr/bin/qemu-$arch-static
flags: F
offset 0
magic 7f454c460201010000000000000000000200b700
mask ffffffffffffff00fffffffffffffffffeffffff
# 要保证 interpreter 指定的文件路径存在,如果没有文件则去参考站点下载放入
- 拉取目标镜像
# 要注意指定 linux/arm64 否则会自动根据宿主机的架构来拉取
docker pull --platform linux/arm64 IMAGE
- 启动目标镜像
docker run --rm -it -d -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static IMAGE
- 确定启动状态
# docker容器在运行状态即是成功
docker ps -a
模拟错误
如果出现以下错误,说明并成功模拟成功目的架构:
- 在启动容器后接任何命令都提示
exec /bin/bash: no such file or directory
- 报错
exec format error
- 启动后查看状态是退出
评论