这篇文章介绍一下使用QEMU进行容器化的构建和执行方式。
QEMU是什么
QEMU是一个通用的开源的跨平台仿真模拟器,提供user和system两种模式。其模拟的作用可是可以模拟在特定的体系结构下的应用的执行或者构建,比如在x86的体系结构的操作系统上运行ARM的应用。
常见问题的场景
在ARM体系结构的硬件环境中安装Docker,然后构建并运行ARM的镜像自然非常简单,但是如果没有ARM环境,只有x86的机器又想做这件事情,这时QEMU也就有了用武之地,比如用友的技术中台似乎就是通过QEMU来模拟ARM硬件进行模拟。
问题再现
事前准备
- 获取ARM格式的Alpine镜像
执行命令:docker pull arm64v8/alpine:3.12.1
liumiaocn:~ liumiao$ docker images |grep arm64v8/alpine
arm64v8/alpine 3.12.1 2e77e061c27f 6 days ago 5.32MB
liumiaocn:~ liumiao$
启动容器并进入
- 启动容器并进入
执行命令:docker run --rm -it arm64v8/alpine:3.12.1 sh
可以看到在x86的机器上执行时出现了如下错误信息:
liumiaocn:~ liumiao$ uname -m
x86_64
liumiaocn:~ liumiao$ docker run --rm -it arm64v8/alpine:3.12.1 sh
standard_init_linux.go:211: exec user process caused "no such file or directory"
liumiaocn:~ liumiao$
有的时候提示现象不同,其实主要原因就在于体系架构不同所导致的
解决方法
可以根据需要到QEMU上下载对应的可执行文件进行执行,还有一种最为简单的方式就是使用容器的方式执行,使用如下命令,可使得当前机器可以直接直接模拟相应的体系结构
执行命令:docker run -