[心得] 手機跑docker
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/htdocs/ 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%B7%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/e79aef095cd08756f7f26ed244355d62)
- [Docker - 第十三章 | 安裝Apache Server](https://morosedog.gitlab.io/docker-20190601-docker13/)
--
https://i.imgur.com/qBnCgUO.jpg
https://i.imgur.com/yLTmoHs.jpg
https://i.imgur.com/WepO17T.jpg
--
推實驗精神
強!
以後手機也可以當伺服器了(?
推
一直都可以啊
要注意log4j阿
我執行的是C++的基岩版,所以才會用到docker,不過謝謝提醒
※ 編輯: ivon852 (42.77.129.10 臺灣), 12/19/2021 15:32:14※ 編輯: ivon852 (42.77.129.10 臺灣), 12/19/2021 15:34:44
好猛!!
先用Termux模擬器再用QEMU下再建立容器..效能折損很大吧
上次測試,慢到要有點耐心
收藏
好玩但一點都不實用的功能 XD
有機會看到手機app全都在容器內跑嗎 XD
那必須再裝一個Docker-Android來跑。但支援手機款式很少
應該會慢到難以想像
我只知道docking
推 長知識了
推
真屌
好屌
原生的:
f3951cb62d74bd770dce27
改kernel難度更大,但是...也不是不可能
太hardcore了!
好厲害樓主是自學程式嗎?
沒什麼,這個僅是按照外國高手的教學步驟實驗的。
※ 編輯: ivon852 (111.255.34.70 臺灣), 12/19/2021 22:36:31
猛
推
推
會改內核就可以了,不過找不到相關的中文教學,有誰可以
教一下怎麼改內核嗎
改kernel等同要從原始碼重新編譯kernel
手機可以跑docker! 下次把yolo的docker包進來看看
樓上等等,不是有tf.js,難道你要用Mali來做訓練
之後該不會還可以多台手機K8s
※ 編輯: ivon852 (180.176.66.2 臺灣), 12/21/2021 00:19:54
猛
許願完得到回覆有推,感恩許願池啊
38
[心得] 編譯修改Android Kernel修改Android kernel(內核)可以開啟一些隱藏的功能,也意味著要從頭編譯kernel,要懂一 點C語言。 先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。 網誌好讀版:33
[請益] 有適合用在生產環境的虛擬機嗎?雖然我大部分的專案都架在雲端 但偶爾會寫一些小程式在本地端自用 本地端的環境是 windows host + docker@ubuntu@virtualbox 即便在低負載 散熱好 硬體規格不錯的狀況下.. virtualbox還是每幾天就會 crash 一次27
[討論] Android 13能跑Windows虛擬機了來自XDA的新聞 Android 13預覽版加入了pKVM的功能 所以就有人拿來裝Windows 11 ARM了 沒有GPU加速但效能接近原生,能夠玩老遊戲9
[請益] Docker compose 使用 postgres 問題請問一下 我創建了 postgres 的容器,然後寫了一個 python 的程式去連接這個資料庫(python 的程式一樣在 docker 上) 然後我目前是使用 docker build run 的方式去啟動,但是如果我連資料庫的 IP 填 127.0.0.1 的話會無法連線,如果改成了資料庫容器裡的 IP(這裡是 172.17.0.2) 就可以成功,為什麼阿? 但是當我換成用 docker-compose 執行時,使用 127.0.0.1 跟 172.17.0.2 都失敗,反而使用電腦的IP(192.168.0.102(跑在虛擬機上)),就可以連成功? 請問問題出在哪裡啊? 我找資料找了一整天找不到類似的文章,來這裡問問大神8
Re: [請益] 有關虛擬化選擇我會建議vmware,商業的東西,還是找大家都在用的,發生問題也比較好解決,或是找業 務來談談。 另外你的需求建議先使用虛擬機就好,看起來你們應該沒有很多人力可以維護,用虛擬機 跟原本用實體機的操作差不多, 碰到的阻力也會比較少。5
[心得] 容器化與Box86執行exe心得: 也許手機未來能執行Steam商店,看是要用Box86硬跑x86 Linux版的Steam,還是隔一層Wine 跑Win32版本的Steam,至少樹莓派台灣已有成功案例。 以內核支援docker的手機,用Termux執行32位元的Ubuntu容器,接著編譯Box86(x86指令轉A5
Re: [麥書] 該換MBP嗎?: : ※ 引述《l88 (188)》之銘言: : : 1. 在Linux上寫的code移植到MacOS上相容性如何?以我可能用到的就是Python的Django : : 或是Java的Spring 這些是不是應該沒什麼平台依賴性? : 幾乎沒有什麼平台依賴性,反而windows會因為檔案名稱格式不同而有點問題1
Re: [請益] docker 在mac上的網路設定簡單說一下你的問題成因 mac docker環境透過在mac系統之內建立虛擬機器產生,本身網路不是直接對外 但是linux docker是linux內建的隔離機制產生,docker與linux都是直接對外 所以今天你指定了127.0.0.1, 在linux是同時指定docker與linux, 但在mac只是指定mac