Run x86 docker images on ARM.
Stereolab有介紹x86平台的Docker透過qemu binfmt模擬ARM image的方式,那反過來呢?
ARM架構下的Docker是否能在不rebuild的情況下執行x86架構的image又不出現exec format error
?
答案是可以,安裝完QEMU套件後,再安裝容器版的QEMU user static模擬器:qemu-user-static (qus)
該映像還支援模擬x86、ARM、ppc等常見架構。
Android#
Android的核心必須 重新編譯支援Docker和binfmt
開啟Termux,安裝QEMU
pkg install qemu-common
- 啟用binfmt
su
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
echo 1 > /proc/sys/fs/binfmt_misc/status
- 啟動Docker後,拉取aptman/qus,設定模擬x86_64架構。
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
- 試著拉取
amd64/ubuntu
的映像檔
sudo docker run --rm -t amd64/ubuntu uname -a
- 正常執行
postmarketOS#
- 裝置:小米Pocophone F1
- 系統:postmarketOS (Alpine Linux)
- 安裝Docker
sudo apk add docker
sudo addgroup $USER docker
sudo apk add docker-compose
sudo rc-service docker start
sudo rc-update add docker default
- 安裝QEMU套件
sudo apk add qemu
- 拉取qus。
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
- 接著試著拉取AMD64架構的ubuntu image,並執行
uname -a
看看輸出結果。
sudo docker run --rm -t amd64/ubuntu uname -a
在沒有安裝binfmt情況下,輸出畫面會顯示exec error
若有安裝binfmt,雖有警告,指令正常執行。
再用time指令跟ARM版的image比較,可見x86執行時間仍有損耗。
樹莓派 Raspberry Pi 4#
- 安裝以下套件
sudo apt-get install qemu binfmt-support qemu-user-static
- 拉取aptman/qus
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
- 測試執行
sudo docker run --rm -t amd64/ubuntu uname -a
- qus會自動在你的binfmt註冊(用指令
updatebinfmt --display
檢視)。若要移除,執行指令:
sudo docker run --rm --privileged aptman/qus -- -r