常用容器部署:画廊与工具类
选容器的两条原则
入了 Container Manager 的坑,第一件事多半是装一堆应用。开始之前先立两条原则,能少走很多弯路:第一,装之前先想清楚隔多久用一次,半年用一次的工具不值得常驻内存,用完就停掉;第二,优先选官方镜像或 LinuxServer 系镜像,文档完善、社区大、出问题搜得到答案。
本篇挑了几类在 NAS 上最实用的应用:照片画廊、服务监控、主页导航、轻量工具。每个都给可直接照抄的 compose 配置,统一放在 /volume1/docker/ 下各自的目录里,端口自行替换成空闲值。
照片画廊:Immich
Immich 是目前最火的自托管照片方案,界面和体验明显对标商业产品,自动备份、人脸识别、地图时间线一应俱全。它对资源的要求偏高,内存低于 6 GB 的机型建议先用官方 Photos 套件。Immich 是多容器架构,正好用来练习 compose 编排,三个容器一条命令起来的成就感是单容器给不了的:
services:
immich-server:
image: ghcr.io/immich-app/immich-server:release
container_name: immich-server
restart: unless-stopped
volumes:
- /volume1/photos:/usr/src/app/upload
env_file: .env
depends_on:
- immich-redis
- immich-database
immich-redis:
image: redis:7
container_name: immich-redis
restart: unless-stopped
immich-database:
image: tensorchord/pgvecto-rs:pg16
container_name: immich-database
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=换成强密码
- POSTGRES_USER=postgres
- POSTGRES_DB=immich
volumes:
- /volume1/docker/immich/db:/var/lib/postgresql/data
镜像仓库不在 Docker Hub 而在 GitHub Container Registry,注册表里搜不到时直接粘贴完整镜像名拉取。机器学习是人脸识别和智能搜索的核心,机器学习模型文件有 1 GB 以上,首次启动会下载一段时间。部署完成后先做三件小事:在移动端装 Immich App 开启自动备份、在管理后台给硬识别任务设置执行时段(避免和转码抢资源)、把照片目录的快照计划配上。Immich 的元数据存在数据库里,照片文件本身也在 /volume1/photos 里,两者一起备份才完整。
| 组件 | 默认端口 | 建议本地端口 | 说明 |
|---|---|---|---|
| Immich 服务端 | 3001 | 3001 | 主入口 |
| Redis | 6379 | 不必映射 | 仅内部通信 |
| 数据库 | 5432 | 不必映射 | 仅内部通信 |
服务监控:Uptime Kuma
Uptime Kuma 是一个精致的监控面板,HTTP、TCP、DNS、ping 都能监控,掉线时推送通知到邮件或者各种 IM。部署只有一个容器,资源占用极小:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- /volume1/docker/uptime-kuma:/app/data
注意端口避开 Immich 的 3001,两台不能同时占用。建好之后第一件事是把 NAS 自己的 DSM 页面、影音服务、下载工具都加进去监控,这一步相当于给整个 NAS 装了报警器。
主页导航:Homepage
服务一多,收藏栏就不够用了。Homepage 是一个纯静态的导航主页,配置文件就是 YAML,把书签、Docker 服务状态、系统资源小部件全揉在一个页面里。镜像本身不带数据库,内存占用不到 100 MB。它还能联动读取容器状态,被监控容器在同一台 NAS 上时,导航页直接绿点红点一目了然:
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
restart: unless-stopped
ports:
- "3002:3000"
volumes:
- /volume1/docker/homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
挂载 docker.sock 是为了读取容器状态,:ro 保证只读不写。Homepage 的书签、服务、小组件全部在 /app/config 下的 YAML 里编辑,改完自动刷新,不用重启容器。

下载与小工具
下载类容器里 qBittorrent 出场率最高,Web 界面挂 PT 站都方便。配置要点是把下载目录映射到媒体文件夹,下完的影视直接进媒体库,省掉搬运环节:
services:
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
- PUID=1026
- PGID=100
- WEBUI_PORT=8081
volumes:
- /volume1/docker/qbittorrent:/config
- /volume1/video/downloads:/downloads
ports:
- "8081:8081"
- "6881:6881"
- "6881:6881/udp"
另外几个万金油小工具值得加入清单:Bitwarden 兼容的密码管理器Vaultwarden,几百 KB 内存就能跑;密码管理类服务务必配合 HTTPS 使用,证书配置见 HTTPS 证书与域名配置。还有在线协作画的 Excalidraw、轻量书签管理 Linkwarden,都属于装了就不想换的类型。部署这些小工具时记得统一加上 restart: unless-stopped,免得重启之后发现导航页空了一片。
选择困难时,先问自己一个问题:这个应用的数据没了会不会心疼。会心疼的(照片、密码、笔记)值得仔细配权限和备份;不会心疼的(监控、导航、临时工具)随便装、坏了重来就行。给每半年一次的清理日留个日历提醒,停掉吃灰的应用,内存和心情都轻松。
部署后的收尾工作
每装一个应用,做三件事:确认容器自动重启策略写对了、确认监控里加上了对应条目、确认导航主页上登记了入口。这套流程跑顺之后,NAS 上几十个服务也能井井有条,而不是散落在各端口里的迷宫。
端口冲突是最容易犯的错。装新应用前先翻一遍正在用的端口,用表格记录:8081 给 qBittorrent、3001 给 Immich、3002 给 Homepage。表格维护在备忘录里,半年后新建容器时这就是唯一的参考。真冲突了也不用慌,容器停掉、改个端口的本地侧、重启即可,容器内部端口号不用动。
另外要考虑容量增长:照片和下载这类应用会持续吃硬盘,部署时就把容量规划进存储池。Immich 的照片库和 qBittorrent 的下载目录建议分别放在不同的共享文件夹里,配额和快照策略可以分开设置,互不影响。

延伸阅读
- 容器自启、更新与资源限制:工具容器的重启与资源封顶
- docker-compose 与多容器编排:多容器项目的统一写法
