? ? ? ? Docker Image是容器運行的基礎(chǔ)睦袖,它是依賴于操作系統(tǒng)的芜繁。不同CPU架構(gòu)的Docker Image需要在相應(yīng)CPU架構(gòu)的機器上去構(gòu)建旺隙,這樣在一定程度上加大了開發(fā)的復雜度,那么有沒有辦法能夠在x86機器上模擬其他架構(gòu)CPU的指令來構(gòu)建Docker Image呢骏令?我們可以使用qemu-user-static.
? ? ? ? qemu-user-static蔬捷,是 QEMU 虛擬機的用戶態(tài)實現(xiàn)。它可以直接在 amd64 系統(tǒng)上運行 OpenPOWER榔袋、ARM周拐、MIPS 等架構(gòu)的 Linux 程序,將指令動態(tài)翻譯成 x86 指令.這樣 不同CPU架構(gòu)的 系統(tǒng)環(huán)境中的進程與主系統(tǒng)的進程一一對應(yīng)摘昌,資源分配靈活速妖,并且易于腳本自動化。需要注意的就是聪黎,當 OpenPOWER罕容、 ARM、MIPS 等架構(gòu)的進程嘗試運行其它進程時稿饰,qemu-user-static 并不會接管新建的進程锦秒。如果新的進程仍然是 ARM 架構(gòu),那么 Linux 內(nèi)核就無法運行它喉镰。因此旅择,需要開啟 Linux 內(nèi)核的 binfmt 功能,該功能可以讓 Linux 內(nèi)核在檢測到OpenPOWER侣姆、 ARM生真、MIPS 等架構(gòu)的程序時沉噩,自動調(diào)用 qemu-user-static。開啟該功能柱蟀,并且注冊 qemu-user-static 虛擬機后川蒙,運行 OpenPOWER程序就和運行 x86 程序一樣,對用戶來說毫無差別长已。 我們可以在x86機器上構(gòu)建其他CPU架構(gòu)的鏡像的時候畜眨,在Dockerfile里分別加入相應(yīng)架構(gòu) qemu-__QEMU_ARCH__-static 這種文件 ,比如我們創(chuàng)建OpenPOWER的ppc64le的鏡像的時候术瓮,我們可以運行COPY qemu-ppc64le-static這個文件康聂。
? ? ? ? 我們介紹一個工具可以在x86機器上創(chuàng)建多架構(gòu)容器鏡像,工具下載地址https://github.com/HaoHHCui/docker-multiarch-builder
下面我們就演示一個在x86機器上同時創(chuàng)建x86和OpenPOWER的ppc64le架構(gòu)的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 我們在不同架構(gòu)的CPU機器上只要運行docker pull haocui/myapp:latest ,自動會下載到對應(yīng)的x86或者ppc64le的鏡像游昼。用戶感覺不到CPU架構(gòu)的差異.
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