上一篇《给朋友搭蓝奏云同款网盘》发出去之后,朋友用了两天网盘,又跑来问我:"哥,你这盒子还能干点啥?能不能搞个影视库?我想要个下载工具,最好手机也能控制。"

我就知道,这家伙是把我当免费 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          # 我的短剧站

端口规划也提前定好,避免冲突:

服务端口说明
Cloudreve5212网盘
qBittorrent8081下载器 WebUI
Alist5244聚合挂载
Jellyfin8096影视库
Portainer9000管理面板
短剧站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 的小盒子,网盘、下载器、影视库全活了。

全家桶里都住了谁

简单列一下我这个盒子现在的住户,每个后面都有单篇细讲:

  1. Cloudreve 网盘——上一篇给朋友搭的,迁移进了全家桶,统一管理
  2. qBittorrent 下载器——远程下载,手机随时丢种子进去,回家直接看
  3. Alist 聚合挂载——把百度网盘、阿里云盘挂成本地盘,白嫖会员功能(懂的都懂)
  4. Jellyfin 影视库——下载完自动刮削海报,电视手机都能看
  5. Portainer 管理面板——网页上可视化管容器,朋友自己也能点点
  6. 我的短剧站——tanqu.cc 那套架构,也搬进了 Docker

几个踩过的坑,提前给你排雷

坑 1:老 Mini 内存不够

2014 款 Mac mini 标配 4G 内存(我的升到了 8G),全家桶全开内存吃紧。我的做法:

坑 2:文件权限问题

容器里的程序默认用 root 跑,但映射出来的数据文件会变成 root 属主,你 ssh 进去改起来很麻烦。LinuxServer 家的镜像都用 PUID/PGID 环境变量指定运行用户,我统一用 1000,和服务器上的用户对齐,后面不会出现"Permission denied"。

坑 3:开机自启

重启服务器后全家桶要自动起来,两个地方:

结尾

到这儿,13W 的小盒子已经是个五脏俱全的"家庭服务器"了。朋友要的影视库、下载器都有了,他以后再提需求,我直接拉个新容器,五分钟搞定。

这一套 Docker 全家桶能玩的东西太多了,我后面会拆开一篇一篇写:Docker 入门、Alist 挂网盘、Jellyfin 影视库、qBittorrent 下载器、Portainer 面板、短剧站部署、功耗实测、备份迁移,都发在我的网站 moxiaoa.com 上。

想跟着折腾的,或者想找我搭服务器、装全家桶的,加我微信 lige0552,备注"全家桶"。

下一篇先讲 Docker 入门——让完全没接触过的小白也能三分钟上手。