? ? ? ? Docker Image是容器運行的基礎,它是依賴于操作系統(tǒng)的。不同CPU架構的Docker Image需要在相應CPU架構的機器上去構建,這樣在一定程度上加大了開發(fā)的復雜度,那么有沒有辦法能夠在x86機器上模擬其他架構CPU的指令來構建Docker Image呢?我們可以使用qemu-user-static.
? ? ? ? qemu-user-static,是 QEMU 虛擬機的用戶態(tài)實現。它可以直接在 amd64 系統(tǒng)上運行 OpenPOWER、ARM、MIPS 等架構的 Linux 程序,將指令動態(tài)翻譯成 x86 指令.這樣 不同CPU架構的 系統(tǒng)環(huán)境中的進程與主系統(tǒng)的進程一一對應,資源分配靈活,并且易于腳本自動化。需要注意的就是,當 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 這種文件 ,比如我們創(chuàng)建OpenPOWER的ppc64le的鏡像的時候,我們可以運行COPY qemu-ppc64le-static這個文件。
? ? ? ? 我們介紹一個工具可以在x86機器上創(chuàng)建多架構容器鏡像,工具下載地址https://github.com/HaoHHCui/docker-multiarch-builder
下面我們就演示一個在x86機器上同時創(chuàng)建x86和OpenPOWER的ppc64le架構的docker image。
1? 下載工具,然后運行
$ sudo ./run-once.sh
2? 創(chuàng)建工程
$ 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腳本
運行腳本以后,工具自動會創(chuàng)建haocui/myapp:ppc64le-latest和haocui/myapp:amd64-latest兩個鏡像,然后會創(chuàng)建一個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