旧安卓手机免 root 运行 Docker 镜像:Droid-Containers 的 proot 用户态容器实现与限制
旧手机上免 root 跑 Docker 镜像: proot 用户态容器的实现与坑
Droid-Containers 用 proot 在免 root 的安卓手机上运行 Docker 镜像,通过用户态 rootfs 切换和文件系统映射模拟容器,并非内核级隔离。
手里几个退役的安卓机一直吃灰,想拿来当小服务器跑点东西——一个 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 上搜得到,这里不贴链接了。
纯本地工具,跟代理、梯子没关系;不过拉镜像需要自己能访问镜像源。
旧手机跑服务的应该不少人,想听听你们实际跑什么、内存占用大概多少。
来源:V2EX · v2ex.com