筆記 Docker 常用指令與 n8n 部署更新全攻略
一般常用 docker 指令
檢查 Container 使用的 Image
docker ps -a
這會列出所有 Container(包括停止的)
重啟 Container:
用名字重啟:
docker start my-n8n
或用 ID 重啟(假設 ID 是 abc123)
docker start abc123
確認運行:
docker p
刪除 Container:
注意:這不會刪除你的資料,因為資料是存在 Volume(n8n_data)或本機路徑(~/n8n-data)裡,而不是 Container 本身。
docker rm my-n8n
列出所有 Image
docker images
初次使用下載並運行 n8n
方式 1:用 Docker Volume(n8n_data)
如果你想在新電腦上用 Docker 管理的 Volume(像之前一樣用 n8n_data):
- 直接下載並運行:
docker run -d --name my-n8n -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n
- 解釋:
- docker run:啟動新 Container。
- -d:背景運行。
- –name my-n8n:命名為 my-n8n。
- -p 5678:5678:映射端口,讓你用 localhost:5678 連線。
- -v n8n_data:/home/node/.n8n:建立並掛載一個名叫 n8n_data 的 Volume 到 n8n 的資料路徑。
- n8nio/n8n:從 Docker Hub 下載最新版 n8n Image。
- 確認運行:
- 輸入:
docker ps
- 看到 my-n8n 在跑就成功了。
- 然後用瀏覽器連 http://localhost:5678。
- 輸入:
用 n8n_data,想更新到最新版:
# 拉取新 Image
docker pull n8nio/n8n
# 停止並刪除舊 Container
docker stop my-n8n
docker rm my-n8n
# 用新 Image 跑新 Container
docker run -d --name my-n8n -p 5678:5678 -e WEBHOOK_URL=https://你的網址.tw -v n8n_data:/home/node/.n8n n8nio/n8n
# 檢查運行狀態
docker ps
然後連 http://localhost:5678 確認。
更新 n8n 版本的流程(步驟詳解)
假設你目前用的是 n8nio/n8n:latest(最新版標籤),而且 Container 名叫 my-n8n,資料存在 n8n_data 或本機路徑(比如 ~/n8n-data)。以下是完整步驟:
步驟 1:拉取新版本的 Image
- 更新 Image:
- 在終端機輸入:
docker pull n8nio/n8n
- 這會下載 n8nio/n8n:latest 的最新版本。
- 如果你用的是特定版本(比如 n8nio/n8n:1.0.0),就把 n8nio/n8n 換成你想要的版本號,例如:
docker pull n8nio/n8n:1.0.0
- 在終端機輸入:
- 確認更新:
- 輸入:
docker images
- 看 n8nio/n8n 的「CREATED」時間或「TAG」,確認有新的 Image(如果沒更新,Docker 會說「Already up to date」)。
- 輸入:
步驟 2:停止並刪除舊 Container
因為 Container 是基於某個特定 Image 版本跑的,即使你更新了 Image,舊 Container 還是用舊版本,所以需要停掉並重建。
- 檢查目前 Container:
- 輸入:
docker ps -a
- 找到 my-n8n 的狀態(可能是「Up」或「Exited」)。
- 輸入:
- 停止 Container:
- 如果它在跑(狀態是「Up」),輸入:
docker stop my-n8n
- 如果它在跑(狀態是「Up」),輸入:
- 刪除 Container:
- 輸入:
docker rm my-n8n
- 注意:這不會刪除你的資料,因為資料是存在 Volume(n8n_data)或本機路徑(~/n8n-data)裡,而不是 Container 本身。
- 輸入:
步驟 3:用新 Image 啟動新 Container
用跟之前一樣的參數跑一個新 Container,這樣新版本的 n8n 會接手舊資料。
- 用 n8n_data 跑:
- 如果你用的是 n8n_data:
docker run -d --name my-n8n -p 5678:5678 -e WEBHOOK_URL=https://你的網址.tw -v n8n_data:/home/node/.n8n n8nio/n8n
- 如果你用的是 n8n_data:
- 確認運行:
- 輸入:
docker ps
- 看到 my-n8n 在跑,狀態是「Up」。
- 輸入:
- 檢查版本:
- 打開瀏覽器,連 http://localhost:5678。
- 在 n8n 介面右下角看版本號,確認是否更新到最新版。
注意事項
- 資料安全:
- 只要你有掛載 Volume(n8n_data 或 ~/n8n-data),刪除 Container 不會影響資料。
- 如果不確定,跑新 Container 前可以用:
docker volume ls
確認 n8n_data 還在,或檢查 ~/n8n-data 裡有沒有檔案。
- 版本相容性:
- n8n 更新時,資料庫結構可能會變。如果新版本不兼容舊資料,啟動時可能會報錯。這種情況下,檢查 n8n 官網的更新說明,看看需不需要手動遷移資料。
- 快速檢查版本:
- 跑完後可以用:
docker exec my-n8n n8n --version
直接在終端機看 n8n 的版本號。
- 跑完後可以用:
-e WEBHOOK_URL=https://你的網址.tw 是什麼意思?
- 簡單解釋:
- 這行是用來告訴 n8n:「當你需要產生 webhook 網址(比如 Telegram Trigger 用來收訊息的地址)時,請用 https://你的網址.tw 當基礎網址。」
- -e 是 Docker 的參數,意思是設定環境變數(environment variable)。這裡的 WEBHOOK_URL 是 n8n 專用的變數,讓它知道自己的公開網址是什麼。
- 為什麼需要?
- n8n 跑在本機時(像 localhost:5678),它不知道自己對外網的公開網址是什麼。
- 你用 Cloudflare Tunnel 把本地的 n8n 連到 https://你的網址.tw,所以要告訴 n8n:「別用 localhost,用這個公開網址來產生 webhook。」
- 這樣 Telegram Trigger 的 webhook 網址才會是像 https://你的網址tw/webhook/一串亂碼,Telegram 才能正確送訊息過來。
- 實際效果:
- 當你設 -e WEBHOOK_URL=https://你的網址.tw,打開 n8n 的 Telegram Trigger 節點,Webhook URL 會自動變成 https://你的網址.tw/…,而不是本地的 http://localhost:5678/…。
轉用 docker-compose(更方便)
你現在用 docker run 每次都要打長串指令,更新時容易忘參數。改用 docker-compose 會簡單很多。步驟如下:
- 創 docker-compose.yml:
- 在家目錄創資料夾:
mkdir ~/n8n cd ~/n8n touch docker-compose.yml
編輯 docker-compose.yml:
- 在家目錄創資料夾:
version: "3"
services:
n8n:
image: n8nio/n8n
container_name: my-n8n
ports:
- "5678:5678"
environment:
- WEBHOOK_URL=https://你的網址.tw
volumes:
- n8n_data:/home/node/.n8n
cloudflared:
image: cloudflare/cloudflared
container_name: cloudflared
command: tunnel --no-autoupdate --hostname 你的網址.tw --url http://host.docker.internal:5678
volumes:
- /Users/你的用戶名/.cloudflared:/home/nonroot/.cloudflared
depends_on:
- n8n
volumes:
n8n_data:
2. 更新流程(未來用):
- 停掉舊的:
cd ~/n8ndocker-compose down
- 拉新映像檔:
docker pull n8nio/n8n
- 跑新的:
docker-compose up -d
3. 好處:
- 設定寫在檔案,不用每次敲長串。
- 跟舊的 n8n_data 無縫接軌。