Docker Image是容器运行的基础,它是依赖于操作系统的。不同CPU架构的Docker Image需要在相应CPU架构的机器上去构建,这样在一定程度上加大了开发的复杂度,那么有没有办法能够在x86机器上模拟其他架构CPU的指令来构建Docker Image呢?我们可以使用qemu-user-static.
qemu-user-static,是 QEMU 虚拟机的用户态实现。它可以直接在 amd64 系统上运行 OpenPOWER、ARM、MIPS 等架构的 Linux 程序,将指令动态翻译成 x86 指令.这样 不同CPU架构的 系统环境中的进程与主系统的进程一一对应,资源分配灵活,并且易于脚本自动化。需要注意的就是,当 OpenPOWER、 ARM、MIPS 等架构的进程尝试运行其它进程时,qemu-user-static 并不会接管新建的进程。如果新的进程仍然是 ARM 架构,那么 Linux 内核就无法运行它。因此,需要开启 Linux 内核的 binfmt 功能,该功能可以让 Linux 内核在检测到OpenPOWER、 ARM、MIPS 等架构的程序时,自动调用 qemu-user-static。开启该功能,并且注册 qemu-user-static 虚拟机后,运行 OpenPOWER程序就和运行 x86 程序一样,对用户来说毫无差别。 我们可以在x86机器上构建其他CPU架构的镜像的时候,在Dockerfile里分别加入相应架构 qemu-__QEMU_ARCH__-static 这种文件 ,比如我们创建OpenPOWER的ppc64le的镜像的时候,我们可以运行COPY qemu-ppc64le-static这个文件。
我们介绍一个工具可以在x86机器上创建多架构容器镜像,工具下载地址https://github.com/HaoHHCui/docker-multiarch-builder
下面我们就演示一个在x86机器上同时创建x86和OpenPOWER的ppc64le架构的docker image。
1 下载工具,然后运行
$ sudo ./run-once.sh
2 创建工程
$ mkdir /usr/src/my-new-docker-project
$ ./init-repo.sh /usr/src/my-new-docker-project
3 进入工程 配置build.config文件
cd /usr/src/my-new-docker-project
build.config配置示例:
REPO="haocui"
IMAGE_NAME="myapp"
IMAGE_VERSION="latest"
DOCKER_CLI_PATH="/usr/src/docker-mutiarch-builder/cli/build"
TARGET_ARCHES="amd64 ppc64le"
4 运行build.sh脚本
运行脚本以后,工具自动会创建haocui/myapp:ppc64le-latest和haocui/myapp:amd64-latest两个镜像,然后会创建一个manifests list 叫haocui/myapp:latest并提交到我们指定的镜像库中。
5 我们在不同架构的CPU机器上只要运行docker pull haocui/myapp:latest ,自动会下载到对应的x86或者ppc64le的镜像。用户感觉不到CPU架构的差异.
6验证
在x86和openpower机器上分别运行docker run haocui/myapp:latest arch
openpower机器返回ppc64le,x86机器返回x86_64
参考 https://lobradov.github.io/Building-docker-multiarch-images/#same-dockerfile-template