把闲置的旧安卓手机变成一台低功耗 NAS,再在它上面跑 Docker 当服务器用,听起来很折腾,但实际是性价比极高的一种玩法。本文从可行性分析、环境准备、两种主流安装方案、容器部署实战到常见问题排查,完整拆解整个流程。
1. 旧安卓手机改 NAS 的背景与核心概念
1.1 旧手机为什么适合当 NAS
很多人家里的抽屉里都躺着几部旧安卓手机,屏幕碎了、电池不耐用了、配置跟不上现在的 App。但这些设备有一个共同点:它本质上是一台完整的 Linux 计算机,有 CPU、内存、存储,支持 Wi-Fi 和有线网络。安卓系统基于 Linux 内核,而其内置的存储芯片通常是 eMMC 或 UFS,寿命和读写性能虽不如高端固态,但作为轻量级 NAS 完全够用。
相比买一台群晖、威联通或者自己组一台 x86 主机,旧安卓手机的成本几乎为零,功耗通常在 2W 到 5W 之间,比动辄几十瓦的 NAS 主机省电得多。再加上它自带电池,在停电时甚至还能撑一段时间(虽然不推荐长时间依赖电池运行)。
所以这个项目的核心思路就是:把旧手机刷好系统或使用容器方案,安装 Docker 环境,让手机变成一个能跑数据库、网页服务、下载工具、内网穿透的 24 小时服务器。
1.2 Docker 在安卓手机上的运行原理
Docker 本身不是一个虚拟机软件,它利用 Linux 内核的命名空间(Namespace)、控制组(Cgroups)、联合文件系统(OverlayFS)等能力,把应用进程隔离在独立的容器环境中。因为它依赖 Linux 内核能力,所以只要能拿到一个相对完整的 Linux 用户态环境,Docker 就有机会跑起来。
安卓手机虽然底层是 Linux 内核,但普通用户环境下你无法直接操作系统目录、无法安装系统级软件包。这就是为什么我们通常需要借助 Termux、Linux Deploy 或第三方 ROM 来获得一个 Linux 用户态。
目前旧安卓手机跑 Docker 的主流方案有三类:
| 方案 | 是否需要 Root | 稳定性 | 推荐程度 |
|---|---|---|---|
| Termux + proot-distro + Docker 静态包 | 不需要 | 一般,受内核和 proot 限制 | 适合折腾体验 |
| Root + Linux Deploy + Docker | 需要 | 高,真正接近原生 Linux | 最推荐 |
| 刷第三方 NAS 固件(如飞牛 NAS、Wanos) | 视机型 | 高 | 适合特定盒子、手机 |
1.3 你能用这台“手机服务器”做什么
一旦 Docker 跑起来,它的能力边界基本就取决于硬件了:
- 部署 MySQL、Redis、MongoDB 等数据库,作为开发测试环境;
- 运行 Nginx、Apache,架设个人网站或反向代理;
- 使用 frp、Tailscale 等工具做内网穿透,远程访问家里的服务;
- 部署 Alist、CloudDrive 等网盘工具,把手机存储变成私有云盘;
- 安装下载工具(如 qBittorrent、Aria2),配合 NAS 目录做离线下载;
- 跑一些轻量的自动化脚本、爬虫、定时任务。
下面会从零开始,分别介绍无 Root 和有 Root 两条路线,以及部署具体容器的完整过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与可行性评估
2.1 硬件建议
虽然理论上一台能开机的安卓手机就能尝试,但为了少踩坑,建议满足以下条件:
- Android 版本:Android 8.0 或以上。系统版本越高,内核和用户态兼容性通常越好。
- 内存:至少 2GB,建议 3GB 以上。Docker 本身占用不大,但容器镜像、运行中的数据库都会吃内存。
- 存储:至少留出 8GB 可用空间。系统本身占一部分,Docker 镜像和数据卷也需要空间。
- Root 权限:如果走 Linux Deploy 方案,必须已经解锁 Bootloader 并获取 Root。
- 散热:长期 24 小时运行,建议拆掉后盖或加一个小散热片,避免电池鼓包和降频。
2.2 软件准备
不同方案依赖的软件不一样,下面按方案分别说明。
无 Root 方案需要:
- Termux(F-Droid 版本较新,Play 商店版本容易缺包)
- Termux 内部安装 proot-distro
有 Root 方案需要:
- KernelSU / Magisk 等任意 Root 管理工具
- Linux Deploy 应用
- 一个已经解开 Bootloader 的手机
关键说明:
不要看到网上有人说“直接 pkg install docker”就以为 Termux 官方仓库还有 Docker 包。实际上 Termux 官方仓库早就不提供 Docker 了,如果你执行 pkg search docker 只会看到一堆无关包。所以无 Root 方案需要到 Docker 官方下载静态二进制,或者借助 proot-distro 进入 Ubuntu 后再安装。
3. 方案一:无 Root 使用 Termux + proot-distro 跑 Docker
如果你不想 Root 手机,或者手机无法解锁 Bootloader,那么这套方案是唯一可行的路子。它的原理是:通过 proot 工具模拟 Root 目录环境,在 Termux 中运行一个完整的 Linux 发行版(比如 Ubuntu),再在这个发行版里安装 Docker。
这里要提前说清楚一个结论:因为 proot 不是真实 Root,Docker 守护进程 dockerd 能否启动取决于内核版本和机型兼容性,这部分成功率和运气有关。 如果你运行后出现 overlayfs 错误、operation not permitted,不要慌,这是正常的兼容问题,后面会给出排查思路。
3.1 安装 Termux
从 F-Droid 下载 Termux,或者直接到 Termux 官方 GitHub Releases 页面下载最新 APK。安装之后打开,先跑一遍更新:
bash复制pkg update -y && pkg upgrade -y
如果遇到下载慢或者 404,可以换清华源。执行:
bash复制termux-change-repo
按照提示选择清华源即可。
3.2 安装 proot-distro 并创建 Ubuntu 环境
Termux 下安装发行版最方便的工具是 proot-distro:
bash复制pkg install proot-distro -y
proot-distro install ubuntu
安装完成之后,登录到 Ubuntu 环境:
bash复制proot-distro login ubuntu
此时你会看到一个类似 root@localhost 的提示符。注意,这只是在 proot 模拟下的 root 身份,不代表你获得了系统级 Root 权限。
进入 Ubuntu 后,先更新软件源:
bash复制apt update && apt upgrade -y
3.3 安装 Docker
由于 proot 环境下无法使用 systemd,所以不能通过 apt install docker.io 之后再用 systemctl start docker 来启动。我们需要下载 Docker 官方静态二进制包。
先安装必要依赖:
bash复制apt install -y curl iptables iproute2
到 GitHub 下载 Docker 静态包。这里需要注意架构问题,大部分旧安卓手机是 arm64 架构,小部分是 armv7,用下面的命令查看:
bash复制uname -m
如果输出 aarch64,下载 docker-版本号.tgz 的 aarch64 版本;如果输出 armv7l,就下载 armhf 版本。以常见版本为例:
bash复制curl -fsSL https://download.docker.com/linux/static/stable/aarch64/docker-27.3.1.tgz -o docker.tgz
tar -xzf docker.tgz
cp docker/* /usr/local/bin/
3.4 尝试启动 dockerd
启动 Docker 守护进程:
bash复制dockerd --storage-driver=vfs
这里特意加了 --storage-driver=vfs,因为在 proot 环境下 overlayfs 很可能不可用。vfs 是性能较差的存储驱动,但胜在兼容性最强。
看到类似以下输出,说明 dockerd 进程起来了:
text复制API listen on /var/run/docker.sock
然后另开一个终端,同样进入 Ubuntu(或者用 Ctrl+Z 挂起再新建终端),验证 Docker 是否可用:
bash复制docker info
如果成功,你就能看到 Docker 的版本、存储驱动、Cgroup 等信息。如果失败,先检查是不是 iptables 权限不足,这是最常见的错误。
bash复制iptables -t nat -L
如果提示 Operation not permitted,说明当前内核限制了 proot 环境下的网络命名空间操作。这种情况下,可以尝试给 dockerd 增加参数:
bash复制dockerd --storage-driver=vfs --iptables=false --bridge=none
但注意,加上 --iptables=false 后容器无法自动进行端口映射,你需要使用 --network=host 模式运行容器。也就是说,要用容器时不再用 -p 8080:80 这种端口映射写法,而是直接让容器共享手机的网络。
无 Root 方案大概就到这里。它能跑,但限制较多,更加适合开发测试、学习 Docker 命令,而不是作为生产级服务器。
4. 方案二:Root + Linux Deploy 安装完整 Docker(推荐)
如果你想真正把旧手机当成一台长期运行的服务器,Root + Linux Deploy 是更稳的选择。它的原理是通过 chroot 方式启动一个完整的 Linux 文件系统,该文件系统内运行着真实的 systemd 或 init 进程,从而能完整支持 Docker 所需的 cgroups、iptables、overlayfs 等能力。
4.1 准备 Root 环境
手机 Root 方式五花八门,无法用一篇文章覆盖所有机型。大致思路是:
- 小米、红米类:解锁 Bootloader 后刷 Magisk;
- 一加、OPPO、vivo:根据官方政策和企业赛道的差异,部分支持解锁;
- 旧三星:使用 Odin 刷入 TWRP,再安装 Magisk;
- MTK 机型:部分可以借助工具直接获取临时 Root。
解锁和刷机属于高风险操作,请先备份手机数据,并确认你理解变砖风险。
Root 成功后,打开终端模拟器,输入 su,看到 # 提示符说明 Root 可用。
4.2 安装 Linux Deploy
Linux Deploy 是一个开源项目,可以在 Google Play 或 GitHub 上下载。它支持在 chroot 和 proot 两种模式下部署 Linux 发行版。既然已经有 Root,我们选择 chroot 模式。
打开 Linux Deploy,进入配置界面,关键参数如下:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 发行版 | Ubuntu | 兼容性和文档最多 |
| 架构 | arm64 或 armhf | 根据手机 CPU 架构自动识别 |
| 发行版版本 | 22.04 或 24.04 | 较新的 LTS 均可 |
| 源地址 | 清华镜像 | 国内下载更快 |
| 安装路径 | /data/local/linux | 注意剩余空间 |
| 用户名 | 自定义 | 建议使用非 root 用户 |
| 启用 SSH | 勾选 | 方便后续操作 |
| 挂载 | 勾选 | 让 Linux 能访问手机部分目录 |
| 桌面环境 | 不勾选 | 服务器不需要图形界面 |
设置完成后,点击右上角的“安装”按钮。Linux Deploy 会开始下载并部署完整的 Ubuntu 文件系统。根据网络情况,这个过程可能需要 10 到 30 分钟。
4.3 启动 Linux 环境
安装完成之后,点击“启动”按钮。如果一切正常,你会看到类似 Starting extra services...、Starting SSH... 的日志。
此时可以通过手机上的终端应用,或者电脑 SSH 连接到 Linux 环境:
bash复制ssh 用户名@手机IP地址
也可以直接在 Linux Deploy 的日志栏看到分配的 IP。如果是在局域网内,手机和电脑连同一个 Wi-Fi 即可。
进入 Linux 环境后,确认网络和软件源:
bash复制uname -a
cat /etc/os-release
apt update -y
如果软件源是官方源速度较慢,替换为清华源:
bash复制sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo apt update -y
4.4 安装 Docker
在 Linux Deploy 的 chroot 环境下,我们可以像普通服务器一样安装 Docker:
bash复制sudo apt install -y docker.io docker-compose-v2
Ubuntu 22.04 及之后版本的 Docker 包对应的 compose 插件已经包含 docker-compose-v2。安装后,需要把当前用户加入 docker 组:
bash复制sudo usermod -aG docker $USER
newgrp docker
然后启动 Docker 服务:
bash复制sudo systemctl enable docker
sudo systemctl start docker
如果 systemctl 在这个环境里不可用(某些 Linux Deploy 配置没有启用 systemd),可以用 service docker start:
bash复制sudo service docker start
验证是否成功:
bash复制docker version
docker run hello-world
如果你看到 Hello from Docker! 的输出,说明 Docker 已经能正常拉取镜像、创建容器并执行命令了。
这里特别强调:相比方案一,方案二的 Docker 在 overlayfs 和 iptables 方面的支持要好很多,容器网络和存储更接近原生服务器环境。
5. 部署常见容器:从 MySQL 到 Nginx 实战
5.1 部署 MySQL 8.0
作为服务器,第一件事往往是跑数据库。这里以 MySQL 8.0 为例,在手机 NAS 环境中部署一个带数据持久化的容器。
创建数据目录:
bash复制mkdir -p /opt/mysql-data
启动容器:
bash复制docker run -d \
--name mysql8 \
--restart=always \
-e MYSQL_ROOT_PASSWORD=your_root_password \
-p 3306:3306 \
-v /opt/mysql-data:/var/lib/mysql \
mysql:8.0
解释一下关键参数:
--restart=always:容器异常退出时自动重启,这对于 24 小时服务器非常重要。-e MYSQL_ROOT_PASSWORD:设置 MySQL root 密码。-p 3306:3306:把容器的 3306 端口映射到宿主机 3306 端口。-v /opt/mysql-data:/var/lib/mysql:数据卷挂载,确保容器删除后数据不丢失。
查看容器日志,确认 MySQL 初始化完成:
bash复制docker logs -f mysql8
看到类似 ready for connections 的日志,说明 MySQL 启动成功。
5.2 部署 Redis 并配置简单认证
Redis 作为缓存中间件,部署起来更轻量:
bash复制mkdir -p /opt/redis-data
docker run -d \
--name redis \
--restart=always \
-p 6379:6379 \
-v /opt/redis-data:/data \
redis:7 redis-server --appendonly yes --requirepass your_redis_password
这里额外解释了 --appendonly yes 开启 AOF 持久化,避免重启后数据全部丢失;--requirepass 设置访问密码,即使在内网也不能裸奔。
5.3 部署 Nginx 静态网站
如果你打算在手机服务器上挂一个静态博客或者文件索引页,Nginx 是最常见的选择:
bash复制mkdir -p /opt/web/html
echo '<h1>Hello from Android NAS</h1>' > /opt/web/html/index.html
docker run -d \
--name nginx \
--restart=always \
-p 8080:80 \
-v /opt/web/html:/usr/share/nginx/html:ro \
nginx:alpine
注意这里宿主机端口换成了 8080,因为 80 端口在 Android 系统上可能被其他服务占用。ro 表示只读挂载,避免容器内部误改宿主机文件。
电脑浏览器访问 http://手机IP:8080 就能看到“Hello from Android NAS”页面。
5.4 部署 Alist 挂载云盘和本地目录
如果你的目标是把这台旧手机当真正的私人网盘,Alist 是一个非常合适的项目。
bash复制mkdir -p /opt/alist/data
docker run -d \
--name alist \
--restart=always \
-p 5244:5244 \
-v /etc/localtime:/etc/localtime:ro \
-v /opt/alist/data:/opt/alist/data \
xhofe/alist:latest
启动后,首次管理密码查看方式:
bash复制docker exec -it alist ./alist admin random
然后访问 http://手机IP:5244,使用输出的账号和随机密码登录,之后可以在后台管理页面修改密码、添加本地目录或云盘账号。
5.5 使用 Docker Compose 统一管理多容器
如果你不想一个个敲 docker run,建议使用 Docker Compose 来管理。创建 /opt/server/docker-compose.yml:
yaml复制version: "3.8"
services:
mysql:
image: mysql:8.0
container_name: mysql8
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
ports:
- "3306:3306"
volumes:
- /opt/mysql-data:/var/lib/mysql
redis:
image: redis:7
container_name: redis
restart: always
command: redis-server --appendonly yes --requirepass your_redis_password
ports:
- "6379:6379"
volumes:
- /opt/redis-data:/data
nginx:
image: nginx:alpine
container_name: nginx
restart: always
ports:
- "8080:80"
volumes:
- /opt/web/html:/usr/share/nginx/html:ro
启动全部服务:
bash复制cd /opt/server
docker compose up -d
查看状态:
bash复制docker compose ps
6. 常见问题与排查思路
旧安卓手机跑 Docker 的坑远比普通服务器多,这里把最常见的几类问题整理成表格:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
dockerd 启动报 operation not permitted |
proot 环境或内核权限不足 | 尝试加 --iptables=false;或改用 Root 方案 |
容器创建失败,/proc 相关错误 |
proot 隔离不完整 | 使用 proot-distro login ubuntu 时加 --isolated 参数再试 |
| Docker 镜像拉取慢或超时 | 国内访问 Docker Hub 不稳定 | 配置镜像加速器,或使用代理节点;不推荐设置可能被安全策略拦截的公共加速器 |
overlayfs 挂载失败 |
proot 环境不支持 overlayfs | 启动时加 --storage-driver=vfs |
| 容器重启了但数据丢失 | 未挂载数据卷 | 删除容器时必须确认 -v 挂载是否配置正确 |
| 手机发热严重 | 电池充电和 CPU 满载共同导致 | 拆电池改直流供电、加散热片、限制容器 CPU |
| MySQL 启动后无法远程连接 | 用户权限或端口未映射 | 检查 docker logs mysql8,确认监听地址是否为 0.0.0.0 |
| 宿主机重启后容器不自启 | 手机系统对后台进程限制严格 | 在 Linux Deploy 中配置开机启动,或使用 --restart=always |
| 内网访问可以,外网无法访问 | 没有端口映射或运营商封锁 | 使用 frp / Tailscale 等方式组网 |
排查时的通用顺序如下:
- 查看容器状态:
docker ps -a - 查看容器日志:
docker logs 容器名 - 确认端口监听:
netstat -tlnp或ss -tlnp - 确认防火墙:如果手机 ROM 自带防火墙,逐一检查放行端口。
7. 最佳实践与工程建议
7.1 存储规划
旧手机的内置存储终究有限,强烈建议规划好目录结构:
text复制/opt
├── mysql-data
├── redis-data
├── web
│ └── html
├── alist
│ └── data
└── server
└── docker-compose.yml
把数据统一放在 /opt 下,备份时只需要打包这一个目录。
如果手机支持 OTG,还可以外接 U 盘或移动硬盘,但需要注意挂载权限。在 Linux Deploy 中,需要把外接存储的挂载点也挂载到 chroot 环境的 /mnt 下,否则容器无法直接访问。
7.2 性能限制与优化
旧手机 CPU 性能有限,部署容器时可以在 docker run 中加上资源限制:
bash复制docker run -d \
--name mysql8 \
--memory="512m" \
--cpus="2" \
...
这样能避免一个容器吃光所有资源导致手机卡死。如果发现手机温度过高,可以进一步降低 CPU 频率,在 Linux Deploy 环境中可以通过 cpufreq-set 限制,但注意不同内核支持程度不同。
7.3 安全加固
把这台手机暴露到公网之前,必须考虑安全:
- 不要使用默认端口和弱密码,所有数据库、Redis、Web 服务尽量设置独立密码;
- SSH 登录建议使用密钥认证,并关闭密码登录;
- 如果只是自己使用,优先用 Tailscale 或 frp 内网穿透,不要把端口直接映射到公网;
- 定期更新容器镜像和系统软件包;
- 不要在手机上存储重要且唯一的备份,它应当是一台可随时重建的服务器。
7.4 备份策略
即便只是折腾项目,也要养成备份习惯。最简单的方式是把 /opt 目录打包后上传到其他 NAS 或对象存储。备份命令示例:
bash复制tar czf /sdcard/server-backup-$(date +%Y%m%d).tar.gz /opt
数据库备份使用 mysqldump:
bash复制docker exec mysql8 mysqldump -uroot -p your_db > /opt/backup/db_$(date +%Y%m%d).sql
7.5 省电与稳定性
如果打算长期运行,建议:
- 移除电池直接使用稳压电源供电,避免电池充放电循环导致损耗和鼓包;
- 开启“充电上限保护”的 ROM 功能(如果有),把电量限制在 80% 左右再长期插电;
- 关闭手机屏幕、蓝牙、GPS,只保留 Wi-Fi;
- 如果手机支持飞行模式下开 Wi-Fi,可以禁用蜂窝模块进一步省电。
8. 总结与下一步学习方向
用旧安卓手机改装 NAS 并跑 Docker,本质上是对 Linux 内核能力的一次复用。整个过程会涉及 Linux 用户态、chroot、容器存储驱动、网络命名空间、数据卷持久化等大量底层知识,哪怕最终只是为了跑一个 MySQL,也能学到很多服务器运维的基础概念。
如果你按照本文走通了 Root + Linux Deploy 方案,说明你的手机内核和系统环境相当配合,这已经比很多盲目尝试的人前进了一步。下一步可以继续学习:
- Docker Compose 编排多容器应用,把数据库、缓存、Web 服务组合成一套完整环境;
- 使用 frp 或 Tailscale 搭建安全的外网访问链路;
- 学习 Linux systemd 服务管理,让容器在系统启动后自动运行;
- 研究如何在限制内存的移动设备上优化容器参数,避免 OOM 频繁触发。
这套方案里最值得记住的经验是:数据必须挂载到宿主机目录,容器必须设置重启策略,任何暴露到公网的服务都必须做认证和加固。把这些规则内化成习惯,那么不光是旧手机 NAS,将来你接触任何云服务器、树莓派、软路由,都能用同一套方法论快速落地。
文章就到这里,如果你正好手头有一台闲置安卓手机,不妨按流程试一遍。顺利的话,你就有了一台“免费”的 24 小时服务器。遇到具体报错,也可以按文中的排查表逐项核对,大部分问题其实就出在存储驱动和网络权限这两个环节上。
