爱意满满的作品展示区。
nestorgu

旧手机上免 root 跑 Docker 镜像: proot 用户态容器的实现与坑

  •  
  •   nestorgu · 8h 47m ago · 325 views

    手里几个退役的安卓机一直吃灰,想拿来当小服务器跑点东西——一个 MQTT broker 、一个测试用的 Postgres 、几个定时脚本。在 Termux 里挨个装依赖、写启动脚本、处理进程被系统回收,折腾几轮就没耐心了。后来干脆把 docker 那一套搬过去:镜像照常用,容器照常起。

    实现上没有走真容器。手机没 root 就不可能有 namespace / cgroup ,这里是用 proot 做用户态的 rootfs 切换和文件系统映射,镜像层用 zstd 解包。所以它严格来说不是内核级隔离——容器之间能互相看见进程,也没有独立的网络栈,所有容器共用宿主端口空间。把它当成"每个环境一个独立目录、互不污染"更准确。

    能跑的:alpine / debian / ubuntu / python / node / postgres / mysql / redis / nginx / mosquitto 这一类,内置十来个模板,起容器时填端口映射和环境变量就行。

    踩过的坑:

    • 前台服务必须常驻。息屏一段时间系统会把 proot 进程收掉,所以只能挂着常驻通知
    • 只有 arm64-v8a 和 x86_64 两个 ABI ,armeabi-v7a 的老机器装不上
    • 镜像解包很吃存储空间。zstd 比 gzip 省一些,但一个 Postgres 镜像照样上 G
    • Android 8 以下不行,主要是前台服务和存储权限的行为差异太大

    和 Termux 的区别:Termux 是按包装的,你要什么自己装;这条路线是把现成镜像整个拉下来跑,每个容器隔离在自己的 rootfs 里,删容器就是删目录,不会把宿主环境搞乱。

    和真 docker 的区别:没有 compose 那套网络模型,容器间通信走宿主端口,端口冲突得自己避。

    许可用的是 PolyForm Noncommercial 1.0.0——源码在仓库里公开,个人用免费,不能商用或二次分发。

    仓库( release 里有 apk ):Droid-Containers

    商店版比 GitHub 版多二十来个内置模板,Play 上搜得到,这里不贴链接了。

    纯本地工具,跟代理、梯子没关系;不过拉镜像需要自己能访问镜像源。

    旧手机跑服务的应该不少人,想听听你们实际跑什么、内存占用大概多少。

    3 replies  •  2026-10-21 17:01:26 +08:00
    BardOS
        1
    BardOS  
       8h 32m ago
    手机体验还是太差,几十块钱的小主机省心
    andforce
        2
    andforce  
       7h 54m ago via iPhone
    好像有用
    nestorgu
        3
    nestorgu  
    OP
       6h 30m ago
    小主机确实省心,7×24 跑的话 x86 的功耗和内存都比手机友好。手机这边唯一的好处是自带电池和 4G ,断电断网还能撑一会儿,适合当兜底节点。代价是 arm64 跑 Postgres 内存很紧,小内存机器只能单实例,shared_buffers 得往小里压,再加上息屏后要靠前台服务吊住 proot 进程,稳定性确实不如小主机。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2880 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 15:31 · PVG 23:31 · LAX 08:31 · JFK 11:31
    ♥ Do have faith in what you're doing.