快轉到主要內容

Android手機跑Docker:Termux安裝headless Alpine Linux QEMU虛擬機

分類   智慧型手機 Termux教學
標籤   QEMU Docker Alpine Linux Android
🗓️ 民國110年 辛丑年
✍ 切換正體/簡體字
目錄

註: 單純跑Docker的話此文講的方法效能不佳,比較實際的做法請看這篇: 以原生效能在Android手機上跑Docker

We need to go deeper…

基本上,Android手機沒辦法直接跑docker,因為kernel根本就不支援。雖然如此,我們還有QEMU虛擬機呀,可惜KVM也沒辦法用。

架構:Termux模擬器建立QEMU虛擬機,虛擬機裡面安裝Docker,然後再通訊埠轉發。

手機: Sony Xperia 5 II,Android 11,8GB RAM。

以簡單的Apache伺服器為例,看能否在手機的瀏覽器,看到虛擬機的docker所建立的網頁。網頁內容如下:

1. 建立虛擬機&安裝Docker
#

  1. 開啟 Termux,輸入指令:
pkg install qemu-utils qemu-common qemu-system-x86_64-headless
  1. 下載內含virt的Alpine Linux作業系統ISO
mkdir alpine && cd $_
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-virt-3.12.3-x86_64.iso
  1. 建立4GB的虛擬硬碟
qemu-img create -f qcow2 alpine.img 4G
  1. 開機
qemu-system-x86_64 -machine q35 -m 1024 -smp cpus=2 -cpu qemu64 \
  -drive if=pflash,format=raw,read-only,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
  -netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
  -cdrom alpine-virt-3.12.3-x86_64.iso \
  -nographic alpine.img
  1. 使用root帳號登入,啟用網路卡。
setup-interfaces
#Available interfaces are: eth0.
#Enter '?' for help on bridges, bonding and vlans.
#Which one do you want to initialize? (or '?' or 'done') [eth0]
#Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
#Do you want to do any manual network configuration? [no]
ifup eth0
  1. 使用oofnikj準備好的answerfile快速安裝系統。
wget https://gist.githubusercontent.com/oofnikj/e79aef095cd08756f7f26ed244355d62/raw/answerfile
  1. 讓開機時能輸出訊息
sed -i -E 's/(local kernel_opts)=.*/\1="console=ttyS0"/' /sbin/setup-disk
  1. 安裝系統至硬碟,期間會要求建立root帳號的密碼。
setup-alpine -f answerfile
  1. 先用poweroff指令關機,接著用這條指令啟動虛擬機(可自行存成腳本):
qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=2 -cpu qemu64 \
  -drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
  -netdev user,id=n1,hostfwd=tcp::2222-:22,hostfwd=tcp::8081-:80 -device virtio-net,netdev=n1 \
  -nographic alpine.img
#m是分配2GB記憶體,cpu是2核CPU,hostfwd則是把手機8081通訊埠轉發到虛擬機的80通訊埠。
  1. 安裝docker,並設定虛擬機開機自動啟動服務。
apk update && apk add docker
service docker start
rc-update add docker

2. 安裝Apache伺服器
#

  1. Pull Apache伺服器的鏡像
docker pull httpd
  1. 執行Apache容器,將虛擬機的80通訊埠轉發到Docker容器的80通訊埠,並將docker容器的檔案路徑對應到系統的/root/website目錄。
docker run -d -p 80:80 --name myapache -v /root/website/:/usr/local/apache2/htdocs/  httpd
  1. 建立一個測試網頁
mkdir website && cd website
vi index.html
  1. 網頁內填入:
<!DOCTYPE html>
<html>
<body>
<h1>My Apache Server</h1>
<img src="https://c.tenor.com/61yCyJVoyr8AAAAd/%E6%A1%B6%E7%A5%9E-%E6%89%93%E5%B7%A5.gif">
</body>
</html>
  1. 手機開啟瀏覽器,輸入localhost:8081/index.html,成功看到Docker的網頁。

3. 總結
#

虛擬機+Docker跑Apache Server似乎還行,不過若執行Minecraft伺服器這類的,性能的損耗就很明顯了。

如果可以省去虛擬化這一層,那麼docker的性能就可以大幅提升,也不用等Alpine Linux花30秒開機。所以 改kernel跑docker效能會更好。

附帶一提,iOS有基於Alpine Linux的 iSH Shell終端機模擬器,理論上也可以如法炮製跑docker。

4. 參考資料
#

相關文章

初探Ubuntu Touch:紅米Note 5 + Android雙重開機
分類   智慧型手機 真Linux手機
標籤   Ubuntu Touch Xiaomi Android
紅米Note 5安裝postmarketOS的執行效能
分類   智慧型手機 真Linux手機
標籤   PostmarketOS Xiaomi
ASUS Zenfone 2 Selfie安裝postmarketOS
分類   智慧型手機 真Linux手機
標籤   PostmarketOS ASUS Zenfone

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。