前言
目前手机的配置并不低,即使是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,