不用打指令,也能在 NAS 上跑 Docker 容器

Synology NAS 的 Container Manager 完整教學:映像拉取、容器建立、Volume 掛載、Compose 部署、網路設定與資源限制,一篇學會在 DSM 上管理 Docker。

你剛買了一台 Synology NAS,聽說可以跑 Docker 裝一堆自架服務,但打開 DSM 找了半天——Docker 在哪?

答案是:Synology 將舊的 Docker 套件改名為 Container Manager;實際可用功能與最低 DSM 版本會依套件版本、機型與 DSM 版本變動。它提供圖形化介面來拉映像、建立容器與管理 Compose 專案,但某些進階操作仍可能需要 CLI 或 SSH。

這篇從零開始,帶你走完 Container Manager 的所有核心操作,包括很多人忽略的網路設定和資源限制。

🎯 這篇適合誰

你的情況 建議閱讀段落
完全不知道 Docker 是什麼 從「核心概念」開始
知道 Docker,但沒在 NAS 上用過 跳到「安裝 Container Manager」
裝好了,想建第一個容器 跳到「拉取映像檔」
想用 Compose 部署多容器服務 跳到「Compose 部署」
容器跑起來但網路不通 看「網路設定」
想限制容器吃多少資源 看「資源限制」

Container Manager 工作流程


🔄 Container Manager vs 舊版 Docker 套件

DSM 7.2 之後,Synology 把「Docker」套件改名為 Container Manager;以下是概念上的差異,實際選單與功能請以你的 DSM/Container Manager 版本為準:

項目 舊版 Docker 套件 Container Manager(DSM 7.2+)
套件名稱 Docker Container Manager
Compose 支援 依舊版套件能力 可在專案頁管理 Compose(依版本)
容器管理介面 基本 改版,資訊更完整
映像搜尋 有,介面更新
記憶體 / CPU 監控 簡單 每容器即時圖表
多容器專案管理 支援 Compose 專案群組
資源限制 SSH 設定 GUI 可設定 CPU / 記憶體上限

最重要的差異是 Compose 支援。以前你要在 SSH 裡用 docker-compose up -d 才能啟動多容器服務,現在直接在網頁介面貼上 YAML 就能完成,大幅降低門檻。

相容性提醒: 不要只看 DSM 主版本判斷能否安裝。請先查 Synology Container Manager 套件頁 與對應的 release notes;升級 DSM 前也要確認備份與現有容器能否復原。


📦 核心概念快速理解

在開始操作之前,先把幾個關鍵詞搞清楚。搞懂這些,之後看介面會順很多。

術語 白話解釋 類比
映像(Image) 一個應用程式的「安裝包」,唯讀 軟體的光碟片
容器(Container) 從映像啟動的「執行中實體」,可讀寫 把光碟裝進去跑起來的程式
Volume 掛載到容器裡的持久化儲存空間 給程式的專用資料夾
網路(Network) 容器之間互相溝通的方式 容器的內部區域網路
Port 映射 把 NAS 的某個 Port 轉進容器內的 Port 大門的分機轉接到辦公室
Compose 用一個 YAML 檔定義多個容器的組合 一份菜單同時點好幾道菜

一個最重要的觀念

容器本身是暫時的。 你刪掉容器,裡面沒有掛載 Volume 的資料會全部消失。

所以任何要保留的資料——設定檔、資料庫、上傳的檔案——都必須透過 Volume 掛載到 NAS 的實體路徑上。這是新手最常犯的錯誤,後面會詳細說明。

想更深入了解 Docker 的概念,可以看 Docker 是什麼?NAS 新手入門完整解說


📥 安裝 Container Manager

硬體需求

Container Manager 的最低 DSM 版本與支援機型會隨套件版本變動;處理器架構只是其中一項條件,還要確認記憶體、套件版本與機型相容性。

支援的主要系列:

  • Plus 系列:DS925+、DS923+、DS723+、DS1522+、DS1525+ 等
  • XS/XS+ 系列:DS1823xs+ 等企業機型
  • DVA 系列:DVA1622、DVA3221 等(含 AI 功能)

不要用單一型號或處理器名稱推斷支援與否;購買或升級前請到 Synology 官網的套件相容性頁面 和 Container Manager release notes 確認。

安裝步驟

  1. 登入 DSM,開啟套件中心
  2. 搜尋欄輸入「Container Manager」
  3. 點擊安裝,確認授權條款
  4. 安裝完成後,在應用程式選單找到 Container Manager 圖示
  5. 首次開啟時,系統會引導你選擇 Docker 資料存放位置

Docker 資料存放位置

這個選擇會影響所有容器的效能:

位置 效能 適合
HDD Volume 一般 資料量大但不要求速度的服務
NVMe Volume 通常延遲較低 資料庫、頻繁讀寫的服務(仍受機型與儲存配置影響)
SHR/RAID Volume 有保護 重要資料的服務

如果你的 NAS 有相容的 NVMe 儲存區,可以評估把高 I/O 服務放上去;先確認容量、耐寫、備份與 DSM 對該儲存配置的支援,不要把「放 NVMe」當成所有服務都會明顯變快的保證。詳細做法可以看 把 Docker 資料搬到 NVMe SSD


🖼️ 拉取映像檔

映像是一切的起點。Container Manager 提供 Registry 搜尋介面,不用記 docker pull 指令。

操作步驟

  1. 開啟 Container Manager → 左側選單點映像
  2. 右上角點新增 → 從 Docker Hub 新增
  3. 搜尋欄輸入映像名稱(例如 nginxuptime-kuma
  4. 從結果列表選擇映像
  5. 選擇 Tag(版本標籤)
  6. 套用開始下載

選映像的原則

來源 辨識方式 說明
Docker Official Image 有官方標章 仍要讀文件、版本與安全公告
linuxserver.io linuxserver/ 開頭 依專案文件與更新節奏評估
作者或社群發佈 作者名/映像名 來源、維護者、權限與更新紀錄都要查

Docker Hub 上的自訂映像品質不一定有保證;下載前應確認來源、標籤、Dockerfile/文件、權限需求與漏洞公告,不要只看搜尋排名或星數。

Tag 選擇策略

Tag 適合 風險
latest 快速測試 版本不固定,更新後可能壞掉
指定版本(1.23.4 正式使用 需手動追蹤新版
大版本(1 平衡 自動更新小版本,大版本不變

建議:正式跑的服務用指定大版本號(例如 louislam/uptime-kuma:1),兼顧穩定和自動安全更新。


🚀 建立容器

映像下載好了,選中映像 → 點執行,進入容器建立精靈。

Port 映射

Port 映射的邏輯是:NAS Port → 容器 Port

設定欄位 說明 範例
本機連接埠 NAS 上你想開放的 Port 8080
容器連接埠 映像文件裡指定的 Port 80

設定後,用 http://NAS-IP:8080 就能連到容器裡的 Port 80 服務。

避開這些 Port

Port 用途 不要佔用
5000 DSM HTTP
5001 DSM HTTPS
80 / 443 Web Station 看情況
6690 Synology Drive

技巧:我習慣用 8000 開頭的 Port 給自架服務——8001、8002、8003 依序排下去,好記又不容易衝突。

Volume 掛載(最重要的步驟)

再說一次:沒設 Volume = 資料會消失。 這是新手最常踩的坑。

推薦的路徑命名慣例:

/volume1/docker/[應用名稱]/
  ├── config/      ← 設定檔
  ├── data/        ← 資料庫或資料
  └── logs/        ← 記錄(可選)

在 Container Manager 的 Volume 設定:

設定欄位 填寫內容 說明
主機資料夾 /volume1/docker/uptime-kuma/data NAS 上的實體路徑
掛載路徑 /app/data 容器內的路徑(看映像文件)
類型 讀/寫 通常選讀/寫

重要:在設定 Volume 之前,先用 File Station 把資料夾建好,確保路徑存在。如果路徑不存在,容器啟動會失敗或自動建立一個 root 權限的資料夾。

環境變數

很多映像透過環境變數控制行為:

變數名稱 用途
TZ Asia/Taipei 設定容器時區
PUID 1026(你的 UID) 指定檔案擁有者
PGID 100(users 群組) 指定群組

取得你的 PUID / PGID:

# SSH 進 NAS 後執行
id 你的使用者名稱
# 輸出:uid=1026(daniel) gid=100(users) ...

注意: PUIDPGID 不是 Docker 通用設定,只有映像明確支援時才有效;有些映像使用自己的使用者、固定 UID 或其他權限模型。請以該映像文件為準,不要因為加了這兩個變數就假設容器不會以 root 執行。

重新啟動原則

選項 行為 適合
不自動重新啟動 停止後不重啟 測試用容器
發生錯誤時重新啟動 崩潰才重啟 一般服務
永遠重新啟動 任何停止都重啟 高可用服務
除非手動停止 類似永遠,但你主動停止不重啟 建議選這個

長期運行的服務選「除非手動停止」(unless-stopped),NAS 重開機後容器會自動恢復。


📋 Compose 部署:一個 YAML 搞定多容器

如果映像文件提供了 docker-compose.yaml,用 Compose 部署是最省事的方式。比起一個一個建容器,Compose 的優勢:

  • 一個檔案定義所有設定:Port、Volume、環境變數、網路全部寫在一起
  • 一鍵啟動 / 停止整組服務:不用逐個容器操作
  • 版本控制:YAML 檔可以存起來,下次部署直接貼上
  • 多容器互連:Compose 自動建立內部網路,容器之間用名稱互通

操作步驟

  1. Container Manager 左側選單 → 專案
  2. 新增 → 輸入專案名稱(例如 uptime-kuma
  3. 選擇專案路徑(建議對應 /volume1/docker/uptime-kuma
  4. 在 YAML 編輯區貼上內容
  5. 下一步預覽 → 完成

Container Manager 會自動執行 docker compose up -d

貼上前可用 Docker Compose 產生器 / 檢查器 確認語法正確,一個拼字錯誤就會啟動失敗。

範例一:Uptime Kuma(服務監控)

監控你所有自架服務的狀態,掛了立刻通知。

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - /volume1/docker/uptime-kuma/data:/app/data
    environment:
      - TZ=Asia/Taipei

部署後用 http://NAS-IP:3001 開啟。詳細設定可以看 Uptime Kuma 完整教學

範例二:Nginx Proxy Manager(反向代理)

讓你用網域名稱存取服務,不用記一堆 Port 號。

services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest  # 正式環境請改用已驗證的固定版本
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - /volume1/docker/npm/data:/data
      - /volume1/docker/npm/letsencrypt:/etc/letsencrypt
    environment:
      - TZ=Asia/Taipei

Port 81 是管理介面。詳細設定可以看 Nginx Proxy Manager 完整教學

範例三:多容器組合(WordPress + MySQL)

Compose 最強大的場景——一個 YAML 同時啟動多個互相依賴的容器:

services:
  wordpress:
    image: wordpress:latest  # 正式環境請改用已驗證的固定版本
    container_name: wordpress
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - /volume1/docker/wordpress/html:/var/www/html
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wp_user
      - WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD}
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: wordpress-db
    restart: unless-stopped
    volumes:
      - /volume1/docker/wordpress/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=${WORDPRESS_DB_PASSWORD}
      - TZ=Asia/Taipei

注意 WORDPRESS_DB_HOST=db 這行——Compose 會自動建立內部網路,WordPress 容器可以用 db 這個名稱找到 MySQL 容器,不需要知道 IP。資料庫密碼應放在受保護的 .env 或 secret,不要把真實密碼提交到 Git。

例如在同一個 Compose 專案的 .env 中保存(並將 .env 排除在公開 Git 之外):

WORDPRESS_DB_PASSWORD=請使用長且隨機的值
MYSQL_ROOT_PASSWORD=請使用另一組長且隨機的值

Compose 專案的日常管理

在 Container Manager 的「專案」頁面:

  • 停止 / 啟動:一次控制所有容器
  • 即時記錄:查看啟動是否成功
  • 編輯:修改 YAML → 存檔 → 重新部署
  • 清除:停止並刪除所有容器(Volume 資料保留)

🌐 網路設定

Container Manager 的網路設定是很多人忽略的部分,但搞不好就會遇到「容器之間連不到」或「外面連不進來」的問題。

三種網路模式

模式 說明 適合
bridge(預設) 容器有獨立 IP,透過 Port 映射對外 大部分情況
host 容器直接用 NAS 的網路,不需要 Port 映射 效能敏感、需要大量 Port
macvlan 容器拿到獨立的區域網路 IP 需要被其他裝置直接存取

大部分情況用 bridge 就好。 如果你需要容器在區域網路上有自己的 IP(例如跑 Pi-hole 或 AdGuard Home),才需要 macvlan。

Bridge 模式的運作邏輯

區域網路 (192.168.1.x)
    │
    ├── NAS (192.168.1.100)
    │     ├── Port 8001 → 容器 A (Port 80)
    │     ├── Port 8002 → 容器 B (Port 80)
    │     └── Port 3001 → 容器 C (Port 3001)
    │
    └── 其他裝置

每個容器在 Docker 的內部網路有自己的 IP(172.17.x.x),但外部看不到。外部存取靠 NAS 的 Port 映射轉進去。

容器之間互相存取

同一個 Compose 專案的容器自動在同一個網路裡,可以用容器名稱互相存取:

# WordPress 連 MySQL,用 "db" 這個名稱就好
WORDPRESS_DB_HOST=db

不同 Compose 專案的容器預設互相看不到。如果需要互通,可以建立共用網路:

# 在 docker-compose.yaml 最後加:
networks:
  shared:
    external: true

# 然後在需要互通的服務加上:
services:
  app:
    networks:
      - shared

在 Container Manager → 網路 → 新增一個名為 shared 的 bridge 網路。


📊 資源限制

NAS 的 CPU 和 RAM 有限,如果某個容器吃太多資源,會拖慢整台 NAS。建議對每個容器設定資源上限。

在 Container Manager 設定

容器設定 → 進階設定 → 可以設定:

項目 建議值 說明
CPU 優先權 除非是核心服務,否則不要設高
記憶體上限 依服務調整 防止記憶體洩漏拖垮整台 NAS

各服務建議記憶體上限

服務 建議上限 說明
Nginx Proxy Manager 256 MB 很輕量
Uptime Kuma 256 MB 監控多個端點時會稍多
Vaultwarden 128 MB 非常輕量
AdGuard Home 256 MB DNS 查詢量大時會多
Jellyfin 2-4 GB 轉碼時吃很多
Immich 2-4 GB 機器學習辨識時吃很多
Home Assistant 512 MB - 1 GB 外掛多時會增加

注意:記憶體上限設太低會讓容器被 OOM Kill(被系統強制關閉)。如果容器一直莫名重啟,檢查是不是記憶體上限設太緊。


🔄 容器更新流程

Container Manager 沒有一鍵更新按鈕,但流程不複雜。

單一容器更新

  1. 映像頁面 → 找到該映像 → 點更新(重新拉取最新版)
  2. 等新映像下載完成
  3. 停止舊容器
  4. 刪除舊容器(Volume 資料不會被刪)
  5. 相同設定重新建立容器

Compose 專案更新

更簡單:

  1. 專案頁面 → 找到專案 → 點編輯
  2. 如果需要改版本號就改,不需要就直接點重新部署
  3. Container Manager 會自動拉新映像、重建容器

更新前的安全措施

  • 備份 Volume 資料:更新前先把 /volume1/docker/[應用名稱]/ 備份一份
  • 記下目前版本:萬一新版有問題可以退回
  • 看 Release Notes:重大版本更新可能有破壞性變更

進階做法:用 Hyper Backup 定期備份整個 /volume1/docker/ 目錄,這樣任何容器出問題都能還原。


🔒 安全性注意事項

Docker 容器跑在你的 NAS 上,安全性不能忽略。

基本原則

  1. 不要用 root 執行容器:設定 PUID / PGID,讓容器用一般使用者權限跑
  2. 不要隨意掛載 docker.sock:除非是管理工具(如 Portainer),否則不要把 /var/run/docker.sock 掛進容器——這等於把整台 NAS 的控制權交出去
  3. 映像來源要可信:優先選官方映像或 linuxserver.io 的映像
  4. 定期更新:映像可能有安全漏洞,保持更新是最基本的防護
  5. 不要對外暴露不需要的 Port:只映射你真正需要的 Port

防火牆設定

如果你在 DSM 有開防火牆(建議開),Container Manager 映射的 Port 需要對應規則:

DSM 控制台 → 安全性 → 防火牆 → 編輯規則 → 新增允許的 Port。

只開你需要從外部存取的 Port。純內部使用的服務(例如資料庫)不需要開防火牆規則。


❓ 常見問題

容器一直重新啟動,怎麼查原因?

在容器清單找到問題容器 → 點進去看記錄分頁。最後幾行通常就是錯誤訊息。

常見原因: - 路徑不存在:Volume 掛載的 NAS 路徑沒建好 - Port 衝突:NAS 上的 Port 已被其他服務佔用 - 環境變數錯誤:密碼、資料庫名稱拼錯 - 記憶體不足:容器被 OOM Kill,放寬記憶體上限 - 映像架構不符:x86 映像跑在 ARM NAS 上

從外網連不到容器?

依序檢查三個地方:

  1. 容器 Port 映射有設正確(NAS Port → 容器 Port)
  2. DSM 防火牆有允許那個 Port
  3. 路由器 Port Forwarding 有把外部 Port 轉到 NAS IP

如果三個都正常還是不行,確認你的 ISP 沒有封鎖該 Port。部分業者會封鎖 80、443 以外的 Port。

更好的做法:不要直接開 Port,改用 Cloudflare TunnelTailscale 從外部存取自架服務,更安全。

更新容器後資料不見了?

最常見的原因:沒有設定 Volume。 容器本身是暫時的,沒掛 Volume 的資料存在容器層,刪除就沒了。

補救方式: - 如果容器還在(沒刪掉),可以用 docker cp 從容器內複製資料出來 - 如果已經刪了,資料無法恢復 - 往後一定要設 Volume,並定期用 Hyper Backup 備份 /volume1/docker/

Docker Hub 拉映像很慢?

Docker Hub 在某些地區速度可能不穩定。不要直接套用網路上的 registry mirror 設定;鏡像可能不完整、來源政策不同或造成版本/供應鏈風險。若確實需要快取或鏡像,請依 Docker 與 Synology 當期文件建立可驗證、可回退的方案。

容器佔用太多空間怎麼辦?

# SSH 進 NAS 後執行
# 查看 Docker 整體空間用量
docker system df

# 清除不用的映像、停止的容器、無用的網路
docker system prune

# 更激進:連沒有被任何容器使用的映像都清掉
docker system prune -a

小心prune -a 會刪掉所有沒在跑的容器和沒被引用的映像。確認你沒有「暫停但打算之後再開」的容器。

Container Manager 和 Portainer 可以同時用嗎?

可以。Portainer 是另一套 Docker 管理 UI,功能比 Container Manager 更豐富(支援 Stack、多節點管理等)。兩者管理的是同一套 Docker,不衝突。

詳見 Portainer CE 完整教學


✨ 小結

Container Manager 是 Synology NAS 上跑 Docker 的標準入口。它把複雜的指令列操作搬進了圖形介面,但核心觀念跟 Docker 一模一樣——搞懂映像、容器、Volume、網路這四個概念,剩下的就是在介面上點幾下的事。

幾個原則,記住就能少踩坑:

  • Volume 一定要設,沒設等於沒有備份
  • 時區設 TZ=Asia/Taipei,不然記錄時間會對不上
  • 重啟原則選「除非手動停止」,NAS 重開機後服務自動恢復
  • 用 Compose 部署,設定可以版本控制,日後維護更容易
  • 資源限制要設,防止一個失控的容器拖垮整台 NAS

Container Manager 跑起來之後,下一步可以加上 Nginx Proxy Manager 做反向代理,用網域名稱存取服務,告別記一堆 Port 號的日子。


官方文件與限制

本文的介面名稱、套件版本與映像需求可能更新;正式部署前請以官方文件及個別映像專案文件為準,並先完成設定檔、Volume、秘密資訊與還原測試的備份。


🔗 延伸閱讀

這篇有幫助嗎? 不用打指令,也能在 NAS 上跑 Docker 容器