Synology Docker Compose 完整教學:資料夾結構、更新與維護
在 Synology NAS 上跑 Docker,第一次最有成就感的時刻通常是容器成功啟動:網頁打開、服務能登入、資料看起來也正常。
但真正的考驗不是第一天,而是三個月後。
你會開始遇到這些問題:資料到底存在哪?容器更新會不會把設定洗掉?好幾個服務的 docker-compose.yml 放哪裡才不亂?要備份的是整個 container,還是只備份資料夾?服務壞了要怎麼重建?
這篇不是再教你安裝某一個服務,而是整理一套 Synology NAS 上可長期使用的 Docker Compose 工作流。之後不管你要架 Gitea、Vaultwarden、n8n、Jellyfin、Immich、Uptime Kuma,都可以用同一套邏輯管理。
🎯 這篇適合誰
| 你的情況 | 建議先看哪段 |
|---|---|
| 剛開始在 NAS 上玩 Docker | 先搞懂 Compose 在管理什麼 |
| 已經裝了好幾個服務,資料夾開始亂 | 資料夾結構建議 |
| 想知道 compose 檔該怎麼寫 | 一份可重複使用的 compose 範本 |
| 害怕更新容器出事 | 更新與回復流程 |
| 想知道該備份哪些東西 | 備份重點 |
🧠 先搞懂 Compose 在管理什麼
Docker 本身可以用單一容器執行服務,但自架久了你會發現,只靠圖形介面點選設定很難長期維護。
Compose 的價值是把一個服務需要的設定寫成文字檔:
- 使用哪個 image
- container 名稱
- 對外 port
- volume 對應
- 環境變數
- restart policy
- network
也就是說,docker-compose.yml 是你的服務說明書。
服務壞了、NAS 重裝了、容器刪掉了,只要資料夾還在,compose 檔還在,就能把服務重新建立起來。
這也是我建議所有 Synology Docker 服務都盡量用 Compose 管理的原因。
如果你還不熟 Docker 基本概念,可以先看 Docker 是什麼?NAS 新手入門完整解說。
🗂️ 資料夾結構建議
我會建議把所有 Docker 服務集中放在一個共享資料夾,例如:
/volume1/docker/
每個服務一個獨立子資料夾:
/volume1/docker/
gitea/
docker-compose.yml
data/
vaultwarden/
docker-compose.yml
data/
n8n/
docker-compose.yml
data/
uptime-kuma/
docker-compose.yml
data/
這樣做有幾個好處:
- 找服務很直覺
- 備份範圍清楚
- 搬家容易
- 排錯時不用到處翻
- 每個服務的資料互不干擾
不要把資料只留在 container 裡。
Container 可以刪、可以重建、可以更新。真正要保護的是 volume 對應出來的 data/、config/、db/ 這些資料夾。
🧾 一份可重複使用的 Compose 範本
以下是一個通用範本:
services:
app:
image: example/example:latest
container_name: example
restart: unless-stopped
ports:
- "8080:80"
volumes:
- /volume1/docker/example/data:/data
environment:
- TZ=Asia/Taipei
幾個欄位可以固定理解:
| 欄位 | 用途 |
|---|---|
image |
服務使用的映像檔 |
container_name |
容器名稱,方便辨識 |
restart |
NAS 重開機後是否自動啟動 |
ports |
NAS port 對應到容器內部 port |
volumes |
把資料存到 NAS 實體資料夾 |
environment |
時區、帳號、資料庫等設定 |
我通常會保留 restart: unless-stopped。
意思是除非你手動停掉,否則 NAS 重開後會自動啟動服務。這對 Uptime Kuma、Vaultwarden、Gitea 這類常駐服務很合理。
🔌 Port 規劃
同一台 NAS 上,多個容器不能使用同一個外部 port。
例如:
ports:
- "3000:3000"
左邊是 NAS 對外 port,右邊是容器內部 port。
如果兩個服務都想用 3000,就要改其中一個:
ports:
- "3001:3000"
之後你可以用:
http://NAS-IP:3001
進入這個服務。
如果要掛網域和 HTTPS,可以再接 Nginx Proxy Manager 或 Cloudflare Tunnel。
🧱 Volume 是最重要的部分
自架服務最常見的災難,是更新或重建容器後資料不見。
通常原因不是 Docker 壞掉,而是 volume 沒有對應好。
正確做法:
volumes:
- /volume1/docker/gitea/data:/data
這代表容器內的 /data 會存到 NAS 上的 /volume1/docker/gitea/data。
只要這個資料夾還在,容器刪掉再重建,資料仍然會回來。
錯誤做法是完全不設定 volume,讓資料留在 container 內部。這種容器看起來能用,但一刪掉資料就跟著走。
🔐 權限與 UID/GID
有些 image 會要求設定使用者 ID,例如:
environment:
- PUID=1026
- PGID=100
或:
environment:
- USER_UID=1026
- USER_GID=100
這類設定是為了讓容器寫入 NAS 資料夾時,權限不會亂掉。
Synology 上常見的群組 ID 是 100,但不同帳號可能不同。你可以用 SSH 查詢:
id 使用者名稱
如果你不想碰 SSH,也可以先照該服務教學建議設定,之後遇到資料夾無法寫入,再回頭查權限。
🔁 更新與回復流程
更新容器前,不要直接按下去就算了。
比較穩的流程是:
- 先確認服務資料都存在
/volume1/docker/服務名稱/。 - 備份該服務資料夾。
- 記下目前 image tag。
- 拉新版 image。
- 重新建立 container。
- 確認服務能登入、資料正常。
如果新版出問題,就把 image tag 改回舊版,再重建。
例如不要永遠只寫:
image: gitea/gitea:latest
重要服務可以改成固定版本:
image: gitea/gitea:1.22
latest 方便,但也比較不可控。密碼庫、Git、照片這種重要服務,我會偏向固定版本,等有空測試再升級。
🛡️ 備份重點
Docker 服務要備份的不是 container,而是三樣東西:
docker-compose.yml- volume 對應的資料夾
- 服務內部匯出的設定或資料庫備份
例如 Gitea 至少要備:
/volume1/docker/gitea/docker-compose.yml
/volume1/docker/gitea/data/
Vaultwarden 至少要備:
/volume1/docker/vaultwarden/docker-compose.yml
/volume1/docker/vaultwarden/data/
可以用 Hyper Backup 完整教學 做版本備份,也可以用 Rclone 或 Cloudflare R2 做離站備份。
🧪 建議的服務維護節奏
如果你已經跑了很多 Docker 服務,可以用這個節奏維護:
每週:
- 看 Uptime Kuma 有沒有異常
- 確認重要服務能登入
- 看 NAS 儲存空間是否快滿
每月:
- 檢查服務是否有安全更新
- 更新非核心服務
- 確認備份任務有成功
每季:
- 測試一次還原
- 清理不用的 image
- 檢查哪些服務其實沒在用
自架不是裝越多越好。
真正穩定的 NAS,是每個服務你都知道資料在哪、怎麼更新、怎麼還原。
📌 小結
Synology 上跑 Docker,最重要的不是學會某個服務的安裝按鈕,而是建立一套可重複的管理方式。
我的建議是:
- 每個服務一個資料夾
- 每個服務都保留
docker-compose.yml - 所有資料都用 volume 映射出來
- 重要服務固定 image 版本
- 更新前先備份
- 定期測試還原
這樣之後你要架任何服務,都不是從零開始,而是在同一套工作流裡加一個新資料夾。
🔗 延伸閱讀
- Docker 是什麼?NAS 新手入門完整解說
- Synology Container Manager 完整教學
- Synology 必裝的 10 個 Docker 服務清單
- Synology NAS 安裝 Portainer:Container Manager 視覺化升級
- 在 Synology NAS 自架 Gitea:輕量 Git 伺服器教學