将手机作为服务器运行docker服务

news2024/11/25 16:38:27

前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ unordered_map与unordered_set的模拟实现

目录 0.前言 1.哈希表&#xff08;HashTable&#xff09;设计 1.1设计思想 1.2 HashTable.h 1.3设计思路 2.unordered_map封装 2.1 UnorderedMap.h 2.2代码解释 2.3测试函数 3.unordered_set封装 3.1 UnorderedSet.h 3.2代码解释 3.3测试函数 4.结语 &#xff08;图像由AI生成&…

项目打包与运行

前端运行时必须有与后端相同的数据库版本&#xff0c;数据库账号密码 右侧maven -> 展开要打包的项目 -> 生命周期 -> 双击package 打包好之后在target目录下 右键打开 在资源目录下输入cmd&#xff0c;执行以下命令即可运行&#xff08;端口号为yml文件…

人流量为王:背后的赚钱密码深度解析

在当今商业世界中&#xff0c;“人流量为王”这一理念被广泛认可和奉行。但你是否认真思考过&#xff0c;这简单的四个字背后&#xff0c;究竟隐藏着怎样复杂而精妙的赚钱逻辑&#xff1f; 一、人流量意味着潜在客户的聚集 想象一下繁华的商业街&#xff0c;熙熙攘攘的人群穿梭…

7月26日JavaSE学习笔记

反射 Java是面向对象的&#xff0c;有对象必须先有类&#xff0c; 有static修饰类的属性和方法&#xff1b;在Java中存储了类的内容&#xff0c;这个内容也应该是一个对象&#xff1b;Java中每一个用到的类都会加载一块内存&#xff0c;这每一块内存都是一个对象&#xff1b;这…

学习周报:文献阅读+HEC RAS案例

目录 摘要 Abstract 文献阅读&#xff1a;通过HEC RAS软件为罗马尼亚布加勒斯特市的Dmbovița河水管理的水力模型 文献摘要 讨论|结论 理论知识 边界条件计算 流量计算方式 曼宁公式 (Mannings Equation) 连续性方程 (Continuity Equation) 能量方程 (Energy Equatio…

EB Tresos 基于S32K3芯片 ICU模块实现gpio外部中断配置[后续更新实现icu模块的其他功能]

环境&#xff1a;eb tresos 27.0.1 port 模块配置&#xff1a; 选择一个具有erq功能的引脚并配置为erq功能。如下我选择的是 PTB0 -EIRQ[8] - SIUL2_EXT_IRQ_8_15_ISR Platform 模块配置 在这个模块中配置中断的开关以及中断句柄 ICU模块配置 具体配置参考博客&#xff1a;…

【python】python大学排名数据抓取+可视化(源码+数据集+可视化+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

深度强化学习 ②(DRL)

参考视频&#xff1a;&#x1f4fa;王树森教授深度强化学习 前言&#xff1a; 最近在学习深度强化学习&#xff0c;学的一知半解&#x1f622;&#x1f622;&#x1f622;&#xff0c;这是我的笔记&#xff0c;欢迎和我一起学习交流~ 这篇博客目前还相对比较乱&#xff0c;后面…

黑马Java零基础视频教程精华部分_5_面向对象综合练习

系列文章目录 文章目录 系列文章目录一、文字版格斗游戏二、文字版格斗游戏进阶版三、对象数组练习1、对象数组1先学习一下键盘录入。注意&#xff1a;两套体系不能混用 对象数组2对象数组3对象数组4对象数组5 一、文字版格斗游戏 GameTes.javat代码如下&#xff1a; package …

[数通网络基础]——广播域与路由器

广播域 广播域概述 广播域是指网络中能接收到同一广播消息的所有设备的集合。 广播域的大小会影响网络的性能和效率。当同一个广播域内广播报文过多时&#xff0c;会对局域网造成干扰&#xff0c;导致网络延迟&#xff0c;网络拥塞&#xff08;上网卡&#xff0c;上网慢&…

hot100-3滑动窗口

3无重复字符得最长字串 438找出字符串中得所有字母异位词 遇到没有限制字母排列方式的&#xff0c;都可以考虑维护一个charCode数组 和第567题相似 567字符串得排列&#xff08;和438一个思路&#xff09;

docker dotnet-dump离线部署

1.下载指定dotnet版本的dotnet-dump 示例地址&#xff1a; https://www.nuget.org/packages/dotnet-dump/3.1.141901#dependencies-body-tab 我本地测试的是netcore 3.1 2. 在本地解压 将文件解压出来。看到any目录,能看到我们要用的dotnet-dump文件 3. 将tools/netcoreapp2.…

AccessLog| 一款开源的日志分析系统

前言 ClkLog作为分析系列产品中的前端数据分析系统&#xff0c;通过采集前端应用数据进行用户行为分析。其社区版从23年9月发布至今已有近一年&#xff0c;商业版也上线快半年&#xff0c;感谢大家一直以来的关注和支持&#xff0c;ClkLog会继续做好产品升级与服务&#xff0c;…

算法-----递归~~搜索~~回溯(宏观认识)

目录 1.什么是递归 1.1二叉树的遍历 1.2快速排序 1.3归并排序 2.为什么会用到递归 3.如何理解递归 4.如何写好一个递归 5.什么是搜索 5.1深度&#xff08;dfs&#xff09;优先遍历&优先搜索 5.2宽度&#xff08;bfs&#xff09;优先遍历&优先搜索 6.回溯 1.什…

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…

【科研技巧】如何查找一个人发表的所有文章

使用此网站 点击作者检索 点击作者名字 可以看到全部文章

SpringBoot运行流程源码分析

run方法核心流程 我们在启动SpringBoot的时候调用的是SpringApplication类的静态run方法。其核心流程如下图所示&#xff1a; 在run方法内完成了SpringApplication的声明周期。&#xff0c;这个过程涉及的几个核心类如下&#xff1a; SpringApplicationRunListeners&#xff…

【C++】:红黑树的应用 --- 封装map和set

点击跳转至文章&#xff1a;【C】&#xff1a;红黑树深度剖析 — 手撕红黑树&#xff01; 目录 前言一&#xff0c;红黑树的改造1. 红黑树的主体框架2. 对红黑树节点结构的改造3. 红黑树的迭代器3.1 迭代器类3.2 Begin() 和 End() 四&#xff0c;红黑树相关接口的改造4.1 Find…

Qt基础 | 自定义界面组件 | 提升法 | 为UI设计器设计自定义界面组件的Widget插件 | MSVC2019编译器中文乱码问题

文章目录 一、自定义 Widget 组件1.自定义 Widget 子类2.自定义 Widget 组件的使用 二、自定义 Qt Designer 插件1.创建 Qt Designer Widget 插件项目2.插件项目各文件的功能实现3.插件的编译与安装4.使用自定义插件5.使用 MSVC 编译器输出中文的问题 一、自定义 Widget 组件 当…

【React】详解受控表单绑定

文章目录 一、受控组件的基本概念1. 什么是受控组件&#xff1f;2. 受控组件的优势3. 基本示例导入和初始化定义函数组件处理输入变化处理表单提交渲染表单导出组件 二、受控组件的进阶用法1. 多个输入框的处理使用多个状态变量使用一个对象管理状态 2. 处理选择框&#xff08;…