上一篇《给朋友搭蓝奏云同款网盘》发出去之后,朋友用了两天网盘,又跑来问我:"哥,你这盒子还能干点啥?能不能搞个影视库?我想要个下载工具,最好手机也能控制。"
我就知道,这家伙是把我当免费 IT 外包了。不过话说回来,一台 2014 年的 Mac mini,装了 Ubuntu 24.04,功耗才 13W 左右,就扔在角落吃灰,确实浪费。我寻思着,与其一个个给他装,不如直接上一套 Docker 全家桶——以后他想加什么服务,拉个容器就行,不用再烦我。
这篇文章就讲讲我是怎么把"全家桶"拉起来的。看完你会发现,折腾服务器这事儿,Docker 一上手,后面全是复制粘贴。
先说结论:为什么是 Docker
给小白朋友解释 Docker,我一般这么说:Docker 就是把一个软件连同它需要的环境,整个打包成一个"集装箱",想用就拉出来跑,不用了直接扔掉重拉,不污染系统。
以前装软件啥样?装个 MySQL,要先装依赖库,配置用户,改配置文件,一不留神把系统搞崩。现在啥样?一行命令,容器跑起来,数据放外面,坏了删掉重建,一分钟的事。
而且全家桶最怕什么?怕各个软件互相冲突。Docker 每个容器都是隔离的,互不干扰,这就是我敢一次拉满的原因。
第一步:装 Docker 和 Compose
Ubuntu 24.04 装 Docker 官方源,三步:
# 1. 添加 Docker 官方 GPG 密钥和源
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 2. 添加仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. 安装
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
装完把当前用户加进 docker 组,免 sudo:
sudo usermod -aG docker $USER
# 重新登录或执行 newgrp docker 生效
然后验证一下:
docker version
docker compose version
Docker Compose 是全家桶的关键——它用一个 YAML 文件把一堆容器统一管理,一条命令全部拉起来,一条命令全部关掉,后面你就知道有多爽。
第二步:规划目录和端口
动手前先规划,不然装到一半乱套。我在服务器上建了统一的数据目录:
sudo mkdir -p /opt/docker
sudo chown -R $USER:$USER /opt/docker
每个服务一个子目录,数据、配置、日志分开存,后面备份也好搞:
/opt/docker
├── cloudreve # 网盘(上一篇装的,迁移过来)
├── qbittorrent # 下载器
├── alist # 网盘聚合挂载
├── jellyfin # 影视库
├── portainer # 可视化管理面板
└── tanqu # 我的短剧站
端口规划也提前定好,避免冲突:
| 服务 | 端口 | 说明 |
|---|---|---|
| Cloudreve | 5212 | 网盘 |
| qBittorrent | 8081 | 下载器 WebUI |
| Alist | 5244 | 聚合挂载 |
| Jellyfin | 8096 | 影视库 |
| Portainer | 9000 | 管理面板 |
| 短剧站 | 8000 | 前后端(避开 80/8080) |
第三步:docker-compose.yml 一键拉满
我写了一个总的 compose 文件,放在 /opt/docker/docker-compose.yml,把全家桶都装进去。每个服务一个 block,结构都一样:镜像、端口映射、数据卷、重启策略。
这里先放一个精简版感受一下(完整版按各服务单独配置,后面每篇细讲):
version: "3.8"
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- WEBUI_PORT=8081
volumes:
- /opt/docker/qbittorrent/config:/config
- /opt/docker/qbittorrent/downloads:/downloads
ports:
- "8081:8081"
- "6881:6881"
- "6881:6881/udp"
restart: unless-stopped
alist:
image: xhofe/alist:latest
container_name: alist
volumes:
- /opt/docker/alist/data:/opt/alist/data
ports:
- "5244:5244"
restart: unless-stopped
然后一条命令全部启动:
cd /opt/docker
docker compose up -d
看到一堆容器"Done"跑起来的那一刻,是真的有成就感——13W 的小盒子,网盘、下载器、影视库全活了。
全家桶里都住了谁
简单列一下我这个盒子现在的住户,每个后面都有单篇细讲:
- Cloudreve 网盘——上一篇给朋友搭的,迁移进了全家桶,统一管理
- qBittorrent 下载器——远程下载,手机随时丢种子进去,回家直接看
- Alist 聚合挂载——把百度网盘、阿里云盘挂成本地盘,白嫖会员功能(懂的都懂)
- Jellyfin 影视库——下载完自动刮削海报,电视手机都能看
- Portainer 管理面板——网页上可视化管容器,朋友自己也能点点
- 我的短剧站——tanqu.cc 那套架构,也搬进了 Docker
几个踩过的坑,提前给你排雷
坑 1:老 Mini 内存不够
2014 款 Mac mini 标配 4G 内存(我的升到了 8G),全家桶全开内存吃紧。我的做法:
- 每个容器都限制内存上限,在 compose 里加
mem_limit: 512m - 不用的容器及时停掉,别全挂着
- Swap 开大一点,2G 的 swap 能救急
坑 2:文件权限问题
容器里的程序默认用 root 跑,但映射出来的数据文件会变成 root 属主,你 ssh 进去改起来很麻烦。LinuxServer 家的镜像都用 PUID/PGID 环境变量指定运行用户,我统一用 1000,和服务器上的用户对齐,后面不会出现"Permission denied"。
坑 3:开机自启
重启服务器后全家桶要自动起来,两个地方:
- compose 里每个服务都写
restart: unless-stopped - Docker 服务本身要开机自启:
sudo systemctl enable docker
结尾
到这儿,13W 的小盒子已经是个五脏俱全的"家庭服务器"了。朋友要的影视库、下载器都有了,他以后再提需求,我直接拉个新容器,五分钟搞定。
这一套 Docker 全家桶能玩的东西太多了,我后面会拆开一篇一篇写:Docker 入门、Alist 挂网盘、Jellyfin 影视库、qBittorrent 下载器、Portainer 面板、短剧站部署、功耗实测、备份迁移,都发在我的网站 moxiaoa.com 上。
想跟着折腾的,或者想找我搭服务器、装全家桶的,加我微信 lige0552,备注"全家桶"。
下一篇先讲 Docker 入门——让完全没接触过的小白也能三分钟上手。