手機跑docker - 手機討論

Jacob avatar
By Jacob
at 2021-12-19T14:18

Table of Contents

We need to go deeper...

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

網誌好讀版: https://bit.ly/3FeHQTN

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

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

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

網頁內容:
https://i.imgur.com/JaeWjno.png


## 建立虛擬機&安裝Docker

1. 開啟Termux (建議安裝[F-droid](https://f-droid.org/en/packages/com.termux/)
本的),輸入指令:
```bash
pkg install qemu-utils qemu-common qemu-system-x86_64-headless
```

2. 下載內含virt的Alpine Linux作業系統iso
```bash
mkdir alpine && cd $_
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-virt-3.12
.3-x86_64.iso
```

3. 建立4G的虛擬硬碟
```bash
qemu-img create -f qcow2 alpine.img 4G
```

4. 開機
```bash
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
```

5. 使用`root`帳號登入,啟用網路卡。
```bash
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
```

6. 使用oofnikj準備好的answerfile安裝系統
```bash
wget https://gist.githubusercontent.com/oofnikj/e79aef095cd08756f7f26ed244355d62
/raw/answerfile
```

7. 讓開機時能輸出訊息
```bash
sed -i -E 's/(local kernel_opts)=.*/\1="console=ttyS0"/' /sbin/setup-disk
```

8. 安裝系統至硬碟,期間會要求建立root帳號的密碼。
```bash
setup-alpine -f answerfile
```

9. 先用`poweroff`指令關機,以後就用這條指令啟動虛擬機(可自行寫成shell):
```bash
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,hostfwd=tcp::8081-:80 -device virtio-
net,netdev=n1 \
-nographic alpine.img
#m是分配1GB記憶體,cpu是2核CPU,hostfwd則是把外部8081通訊埠轉發到虛擬機的80通訊
埠。
```
10. 安裝docker,並設定開機自動啟動服務。
```bash
apk update && apk add docker
service docker start
rc-update add docker
```

## 安裝Apache伺服器

1. Pull Apache伺服器
```bash
docker pull httpd
```

2. 執行Apache,將虛擬機的80通訊埠轉發到Docker容器的80通訊埠,並將docker容器的檔
案路徑對應到系統的`/root/website`目錄。
```bash
docker run -d -p 80:80 --name myapache -v /root/website/:/usr/local/apache2/htdo
cs/ httpd
```

3. 建立一個測試網頁
```bash
mkdir website && cd website
vi index.html
```

4. 網頁內填入:
```html
<!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%B
7%A5.gif">
</body>
</html>
```

5. 手機開啟Chrome瀏覽器,輸入`localhost:8081/index.html`,成功看到Docker的網頁。
https://i.imgur.com/IdIe6Qg.png


## 總結

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

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

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


## 參考資料

- [Docker on Termux in a VM](https://gist.github.com/oofnikj/e79aef095cd08756f7f
26ed244355d62)

- [Docker - 第十三章 | 安裝Apache Server](https://morosedog.gitlab.io/docker-201
90601-docker13/)

--
https://i.imgur.com/qBnCgUO.jpg
https://i.imgur.com/klpjZcQ.jpg
https://i.imgur.com/yLTmoHs.jpg
https://i.imgur.com/WepO17T.jpg

--
Tags: 手機

All Comments

Dora avatar
By Dora
at 2021-12-21T17:32
推實驗精神
Quintina avatar
By Quintina
at 2021-12-23T20:46
強!
Andrew avatar
By Andrew
at 2021-12-25T23:59
以後手機也可以當伺服器了(?
Hedy avatar
By Hedy
at 2021-12-25T10:53
Poppy avatar
By Poppy
at 2021-12-27T14:06
一直都可以啊
Annie avatar
By Annie
at 2021-12-25T10:53
要注意log4j阿
Rachel avatar
By Rachel
at 2021-12-27T14:06
好猛!!
Skylar Davis avatar
By Skylar Davis
at 2021-12-25T10:53
先用Termux模擬器再用QEMU下再建立容器..效能折損很大吧
Leila avatar
By Leila
at 2021-12-27T14:06
上次測試,慢到要有點耐心
Lily avatar
By Lily
at 2021-12-25T10:53
收藏
Elvira avatar
By Elvira
at 2021-12-27T14:06
好玩但一點都不實用的功能 XD
Jake avatar
By Jake
at 2021-12-25T10:53
有機會看到手機app全都在容器內跑嗎 XD
Hamiltion avatar
By Hamiltion
at 2021-12-27T14:06
那必須再裝一個Docker-Android來跑。但支援手機款式很少
應該會慢到難以想像
Regina avatar
By Regina
at 2021-12-25T10:53
我只知道docking
Hedwig avatar
By Hedwig
at 2021-12-27T14:06
推 長知識了
Olivia avatar
By Olivia
at 2021-12-25T10:53
Christine avatar
By Christine
at 2021-12-27T14:06
真屌
Ethan avatar
By Ethan
at 2021-12-25T10:53
好屌
Donna avatar
By Donna
at 2021-12-27T14:06
原生的:
https://gist.github.com/FreddieOliveira/efe850df7f
f3951cb62d74bd770dce27
Olga avatar
By Olga
at 2021-12-25T10:53
太hardcore了!
Aaliyah avatar
By Aaliyah
at 2021-12-27T14:06
好厲害樓主是自學程式嗎?
Genevieve avatar
By Genevieve
at 2021-12-25T10:53
Mia avatar
By Mia
at 2021-12-27T14:06
Oliver avatar
By Oliver
at 2021-12-25T10:53
Olivia avatar
By Olivia
at 2021-12-27T14:06
會改內核就可以了,不過找不到相關的中文教學,有誰可以
教一下怎麼改內核嗎
Doris avatar
By Doris
at 2021-12-25T10:53
手機可以跑docker! 下次把yolo的docker包進來看看
Tom avatar
By Tom
at 2021-12-27T14:06
樓上等等,不是有tf.js,難道你要用Mali來做訓練
Dora avatar
By Dora
at 2021-12-25T10:53
之後該不會還可以多台手機K8s
Michael avatar
By Michael
at 2021-12-27T14:06
Kumar avatar
By Kumar
at 2021-12-25T10:53
許願完得到回覆有推,感恩許願池啊

sharp SH-06E 螢幕截圖?

Madame avatar
By Madame
at 2021-12-19T11:59
小妹之前買了一隻日本手機(平行輸入),如下 https://reurl.cc/em1e2W 最近需要整理資料,所以必須要螢幕擷取資料或是攝螢幕介面影 但是查了一下網路,幾乎都是如以下所示 https://tw.sharp/node/328 但是按了電源鍵 + 音源鍵(上下兩顆) 還是沒有效果,go ...

15k左右長輩購機選擇

Eden avatar
By Eden
at 2021-12-19T11:18
1.預算範圍/考慮機種:15k上下 ,最多20k / 考慮A52S , S20FE , pixel6,小米11T中但無 法抉擇.. .若有其他推薦也可以 2.使用需求:家中長輩換手機,較常看劇,沒有遊戲需求 3.品牌喜好:上隻手機是zf5,除了不要apple之外沒特別喜好 4.補充說明: - ...

20K內 s20fe/Pixel 6

Elizabeth avatar
By Elizabeth
at 2021-12-19T11:12
1.預算範圍/考慮機種: 20K內,目前考慮P6跟s20fe 2.使用需求: 主要是希望拍照跟續航好一點,不玩遊戲所以效能不太要求 希望螢幕能夠好一點,因為常看影集,如果有耳機孔更好但這就隨緣了 3.品牌喜好: 不要中國品牌 4.補充說明: 我自己是覺得我的需求s20fe就夠了,而且還支援記憶卡對我來說 ...

三星A71有時會突然亮螢幕?

Skylar DavisLinda avatar
By Skylar DavisLinda
at 2021-12-19T10:37
如題,本身使用的是三星A71-4G版,手機螢幕有時候會突然亮起,但   也沒有顯示什麼通知。 請問這是為什麼呢?第一個協助正確解答的鄉民奉上稅後1000P表示謝意。 - ...

手機螢幕破了才貼保護貼可以嗎?

Kristin avatar
By Kristin
at 2021-12-19T00:43
如題,iPhone6S 摔到,螢幕下邊指紋辨識附近有點蜘蛛網了 就有點好奇螢幕裂了再貼保護貼能繼續用嗎 XD 有 google 過但查不到相關的文章,只查到保貼裂了繼續用傷到手指的新聞 這樣做除了外觀還是會有裂痕之外,會有什麼其他問題嗎? - ...