如何在ARM架構的裝置執行x86架構的Docker Image

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

  1. Android的核心必須重新編譯支援Docker和binfmt

  2. 開啟Termux,安裝QEMU

1
pkg install qemu-common
  1. 啟用binfmt
1
2
3
su
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
echo 1 > /proc/sys/fs/binfmt_misc/status
  1. 啟動Docker後,拉取aptman/qus,設定模擬x86_64架構。
1
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
  1. 試著拉取amd64/ubuntu的映像檔
1
sudo docker run --rm -t amd64/ubuntu uname -a
  1. 正常執行

postmarketOS

  • 裝置:小米Pocophone F1
  • 系統:postmarketOS (Alpine Linux)
  1. 安裝Docker
1
2
3
4
5
sudo apk add docker
sudo addgroup $USER docker
sudo apk add docker-compose
sudo rc-service docker start
sudo rc-update add docker default
  1. 安裝QEMU套件
1
sudo apk add qemu
  1. 拉取qus。
1
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
  1. 接著試著拉取AMD64架構的ubuntu image,並執行uname -a看看輸出結果。
1
sudo docker run --rm -t amd64/ubuntu uname -a
  1. 在沒有安裝binfmt情況下,輸出畫面會顯示exec error

  2. 若有安裝binfmt,雖有警告,指令正常執行。

  3. 再用time指令跟ARM版的image比較,可見x86執行時間仍有損耗。

樹莓派 Raspberry Pi 4

  1. 安裝以下套件
1
sudo apt-get install qemu binfmt-support qemu-user-static
  1. 拉取aptman/qus
1
sudo docker run --rm --privileged aptman/qus -s -- -p x86_64
  1. 測試執行
1
sudo docker run --rm -t amd64/ubuntu uname -a

參考資料


感謝您的閱讀。歡迎分享Ivon的部落格(ivonblog.com)的文章,引用或轉載請註明文章網址,並遵守創用CC-姓名標示-非商業性-禁止改作 4.0 國際授權條款。如需商業使用請來信告之。

written by human, not by AI

如果本網站文章對您有幫助,歡迎請我喝杯珍珠奶茶。

留言板

點選按鈕,選擇您覺得方便的留言系統。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要登入Github帳號才能留言。支援markdown語法,方便您張貼程式碼,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus投放的廣告。無論有無登入皆可留言。此處留言只有本站參與者看得到。若您選擇以訪客身份匿名留言,就不會收到後續回覆通知。