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

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

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

答案是:DSM 7.2 之後,Docker 已經被升級成 Container Manager。它是一套完整的圖形化 Docker 管理介面,不用記指令、不用開 SSH,直接在網頁上就能拉映像、建容器、貼 Compose 一鍵啟動服務。

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

🎯 這篇適合誰

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

Container Manager 工作流程


🔄 Container Manager vs 舊版 Docker 套件

DSM 7.2 是一個分水嶺。Synology 在這版把「Docker」套件正式改名為 Container Manager,同時帶來幾個實質升級:

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

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

如果你的 DSM 還是 7.1 或更舊,強烈建議先升級到 7.2+。Container Manager 的 Compose 功能會讓你的 Docker 管理體驗完全不同。


📦 核心概念快速理解

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

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

一個最重要的觀念

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

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

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


📥 安裝 Container Manager

硬體需求

Container Manager 需要 DSM 7.2 或更新版本,而且只有搭載 x86_64 或 ARMv8 處理器的機型才支援。

支援的主要系列:

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

不支援的機型:使用 Realtek RTD1619B 等 ARMv7 處理器的入門機種(如舊款 DS220j)無法安裝 Container Manager。購買前請先到 Synology 官網的套件相容性頁面 確認。

安裝步驟

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

Docker 資料存放位置

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

位置 效能 適合
HDD Volume 一般 資料量大但不要求速度的服務
NVMe Volume 最快 資料庫、頻繁讀寫的服務
SHR/RAID Volume 有保護 重要資料的服務

如果你的 NAS 有 NVMe SSD,強烈建議把 Docker 資料放在 NVMe Volume 上。容器啟動速度和資料庫查詢效能會有明顯提升。詳細做法可以看 把 Docker 資料搬到 NVMe SSD


🖼️ 拉取映像檔

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

操作步驟

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

選映像的原則

來源 辨識方式 說明
Docker 官方 有「Docker Official Image」標章 品質最高,但功能較精簡
linuxserver.io linuxserver/ 開頭 社群維護品質好,文件詳細
作者發佈 作者名/映像名 看 Docker Hub 的星數和更新頻率

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) ...

為什麼要設 PUID/PGID? 如果不設,容器內的程式會用 root 權限寫檔案,你在 File Station 裡可能會遇到權限錯誤。設了之後,容器寫出來的檔案跟你的 DSM 帳號同權限。

重新啟動原則

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

長期運行的服務選「除非手動停止」(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=your_secure_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=root_secure_password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wp_user
      - MYSQL_PASSWORD=your_secure_password
      - TZ=Asia/Taipei

注意 WORDPRESS_DB_HOST=db 這行——Compose 會自動建立內部網路,WordPress 容器可以用 db 這個名稱找到 MySQL 容器,不需要知道 IP。

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):

SSH 進 NAS,編輯 /var/packages/ContainerManager/etc/dockerd.json,加入:

{
  "registry-mirrors": ["https://mirror.gcr.io"]
}

然後重啟 Container Manager 套件。

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

# 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 號的日子。


🔗 延伸閱讀

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