前言
目前手機的配置並不低,即使是2019年生產的一加七Pro,配置也有12+256,CPU是驍龍855,作為伺服器執行著配置綽綽有餘了,二手的價格現在是400左右也能接受。相對於是自帶ups電源的便攜低耗docker伺服器,還能同時使用安卓系統,配上adb遠端做雲手機也可以。
要想原生支援docker不僅需要root,安卓核心還需開啟docker需要的核心引數。有興趣的可以看之前的文章:在安卓手機上執行原生docker。當然還有一些不root執行的方法,只是效率較低,我就不考慮了。
總結
測試下來和arm Ubuntu裡執行docker基本沒啥區別(除了不能使用-p對映埠)。另外因為核心版本有點低(4.14),可能執行某些服務會有些問題,比如下面的redis會出警告,需要忽略警告。
下面只測試了四個映象:halo、redis、jupyter、gitea。其他的映象應該也是一樣,比如用alist掛載網盤配合nplayer播放網盤的影片等。
執行爬蟲也是沒問題,之前公司的伺服器就是arm架構的,跑scrapy爬蟲都可以。
執行截圖
docker status
看不了資源佔用
上面開了四個容器,用htop檢視資源佔用並不高
準備工作
- 一加七Pro手機(其他手機需自己編譯核心)
- lineage19.1刷機包
- 已開啟核心引數的boot.img
- termux
刷機包和boot下載:https://www.123pan.com/s/ihEKVv-3VOx.html
提取碼: D5Cm
,裡面還有一個containerd
降級包也下載下來,後面會用到。
termux可以從官網或者f-droid下載,需要注意的是termux和termux-boot需要對應,要麼都從github下載,要麼都從f-droid下載。
刷機
如果一加七Pro到手是ColorOS12系統,會無法解鎖bootloader,需要降級到氫氧系統(9-11)版本才能解鎖,需要的可以看: 回退到氫OS的簡單方法。
lineage
先用mt管理器提取boot.img
、dtbo.img
和vbmeta.img
三個檔案。提取步驟很簡單,隨便哪個手機(不需要root)安裝mt管理員,開啟lineage刷機包裡的payload.bin檔案,將裡面的img複製出來傳到電腦上。
然後進入fastboot模式下將這三個img刷入手機
fastboot flash dtbo dtbo.img
fastboot flash vbmeta vbmeta.img
fastboot flash boot boot.img
接著用音量上下鍵切換到recovery模式,在用adb sideload
刷入lineage刷機包。
刷完重啟進入系統,然後在進入fastboot模式下刷入修改後的boot.img後重啟,安裝kernelsu管理器,這時候應該能顯示root。
去除網路受限提示
adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204
adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204
如果不去除的話,WIFI不會自動連線。
WIFI adb
https://github.com/RikkaApps/WADB/releases
下載WADB,並設定開機自啟,既然要做伺服器就都設定開機自啟。
termux
我因為解除安裝了重灌出現了個問題:Unable to install bootstrap
,是因為之前有root許可權導致/data/data/com.termux
目錄解除安裝時沒有被刪除,然後重新安裝termux無法訪問該目錄,所有隻需要刪除這個目錄(rm -rf /data/data/com.termux
)再安裝。
換源
執行termux-change-repo
命令,按如下操作切換到清華源(阿里源也可以)。
ssh
pkg install openssh
sshd
啟動ssh服務
whoami
檢視使用者名稱
passwd
設定密碼
然後就能在電腦上連線: ssh -p 8022 u0_a140@192.168.31.248
安裝docker
先安裝下需要的包: pkg install root-repo tsu which vim docker -y
安裝docker的時候會有上面的提示,叫你掛載cgroup和檢測核心引數是否開啟。
tsu
mount -t tmpfs -o mode=755 tmpfs /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/devices
mount -t cgroup -o devices cgroup /sys/fs/cgroup/devices
exit
之前測試使用mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
也可以,不過最好還是按官方建議來。
docker換源
mkdir -p /data/data/com.termux/files/usr/etc/docker
vim /data/data/com.termux/files/usr/etc/docker/daemon.json
將下面的內容加到這個檔案裡,記得前面要加個英文逗號
"registry-mirrors": [
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn"
]
降級containerd
原因見上面編譯核心的那篇文章。將網盤裡的containerd_1.6.21-1_aarch64.deb
用xftp上傳到手機上,然後dpkg -i containerd_1.6.21-1_aarch64.deb
安裝這個包
還需要讓這個包不被apt更新,apt-mark hold containerd
,可以檢視下不會更新的包apt-mark showhold
。
執行docker
sudo dockerd --iptables=false
測試不加--iptables也是正常的。
另起一個終端:sudo docker run hello-world
建立自啟服務
https://wiki.termux.com/wiki/Termux-services
pkg install termux-services -y
自啟服務的管理目錄是在$PREFIX/var/service
,因為我們安裝了sshd和docker,所以現在已經有兩個服務。
dockerd的目錄結構如下:
- down: 如果該檔案存在,則服務目前是禁用狀態
- finish: 停止時執行的指令碼
- log: 這個不用管,按教程生成就行了
- run: 啟動時執行的指令碼
- supervise: 估計的服務執行的一些檔案
可以使用以下命令來管理服務:
sv-enable sshd
: sshd服務設為自啟動sv-disable sshd
: 取消sshd自啟動sv down sshd
: 停止sshd服務,並使本次Termux執行期間sshd自啟動服務失效sv up sshd
: 啟動sshd服務sv status sshd
: 檢視sshd服務執行狀態
類似sv-enable dockerd
就是將docker設為自啟動。如果想建立自己的服務,跟dockerd目錄結構是一樣的,在run裡面寫需要執行的命令。然後用下面兩行命令建立log目錄就可以了。
mkdir -p $PREFIX/var/service/<PKG>/log
ln -sf $PREFIX/share/termux-services/svlogger $PREFIX/var/service/<PKG>/log/run
實戰
halo
https://www.halo.run/
這是個建部落格的,我一直在用它,不過我只是用它裡面的日誌記錄一些東西。沒找到比這個更好記錄這種瑣碎的小片段更好的東西,這個還能搜尋。
tsu
docker pull halohub/halo:1.5.5
docker run -it --rm --name halo --net=host -v /data/data/com.termux/files/home/halo:/root/.halo halohub/halo:1.5.5
測試使用-p
對映埠時,外部無法訪問,只能使用--net=host
,如果想修改埠的話,就需要改容器裡的埠設定了。如果需要容器後臺執行,則將-it --rm
改成-d
。
然後透過手機ip就能進入到部落格的安裝頁面:
redis
docker pull redisfab/rebloom:2.8.1-arm64v8-bionic
如果直接啟動會有這個錯誤,搜尋了下是因為核心某些特性不支援,說可以在配置檔案裡忽略警告試試
Redis will now exit to prevent data corruption. Note that it is possible to suppress this warning by setting the following config: ignore-warnings ARM64-COW-BUG
從dockerhub檢視當前映象使用的redis版本
然後去官網下載對應版本的配置檔案(這個是下載7.2),去掉最後一行的註釋。然後將bind註釋掉,protected-mode yes
改成protected-mode no
。可以新增requirepass
,後面跟密碼。操作和redis沒啥區別
執行時有個警告,說/proc/sys/net/core/somaxconn
數字太小了
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
那改大一點echo 1024 > /proc/sys/net/core/somaxconn
docker run -it --rm --net=host -v /data/data/com.termux/files/home/redis.conf:/etc/redis.conf \
redisfab/rebloom:2.8.1-arm64v8-bionic \
/usr/local/bin/redis-server /etc/redis.conf
用redis客戶端連線一下可以發現可以連線
gitea
docker pull gitea/gitea:1.22-nightly
id
檢視當前使用者的id
docker run -d --name gitea \
--net=host \
-e USER_UID=10145 \
-e USER_GID=10145 \
-v /data/data/com.termux/files/home/gitea-data:/data \
gitea/gitea:1.22-nightly
瀏覽器訪問http://ip:3000
進入安裝頁面
jupyter
docker pull jupyter/minimal-notebook:python-3.8
docker run -it --rm \
--net=host \
-v /data/data/com.termux/files/home/jupyter:/home/jovyan/work \
--name jupyter \
jupyter/minimal-notebook:python-3.8 \
start-notebook.sh \
--NotebookApp.password='argon2:$argon2id$v=19$m=10240,t=10,p=8$a5BXs81gVemKgrXkzY6zVg$2hAJiXc1TFAYl+DKB0RzaHK8lsTczk8/QgCUCch7cys' \
--NotebookApp.allow_password_change=False \
--NotebookApp.allow_remote_access=True \
--NotebookApp.open_browser=False \
--NotebookApp.notebook_dir="/home/jovyan/work"
啟動時間很久,大概需要三四分鐘,不清楚在準備什麼。然後在瀏覽器訪問http://ip:8888
,輸入密碼123456,
本文由部落格一文多發平臺 OpenWrite 釋出!