將手機作為伺服器執行docker服務

Python成长路發表於2024-07-26

前言

目前手機的配置並不低,即使是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.imgdtbo.imgvbmeta.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 釋出!

相關文章