Docker Compose 實戰筆記:指令、Volumes 與資料庫備份
這篇筆記整理了 Docker Compose 的常用指令、核心概念(如 Volumes 和 Exec),以及一個實際的 PostgreSQL 資料庫備份範例。
⚡ 常用指令速查 (Cheatsheet)
在含有 docker-compose.yml 的目錄下執行:
# 啟動與停止
$ docker compose up -d # 建立並在背景啟動 (Detached mode)
$ docker compose stop # 停止 containers
$ docker compose start # 啟動已存在的 containers
$ docker compose restart # 重啟 containers
# 移除
$ docker compose down # 停止並移除 containers, networks
$ docker compose down -v # 停止並移除 containers, networks 以及 volumes (小心使用)
$ docker compose rm # 移除已停止的 containers
$ docker compose rm -f # 強制移除 containers
# 查看狀態
$ docker compose logs -f # 持續追蹤 container 日誌
$ docker compose ps # 列出此專案的 containers
💡 關鍵差異:up vs up --build
當你修改了程式碼或 Dockerfile 後,重新啟動的方式很重要:
warning
docker compose up -d (沒有 --build)
- Docker 會檢查本地是否已有該服務的 image。
- 有:直接使用現有 image。
- 沒有:才會執行 build 或 pull。
- 缺點:若 image 已存在,Docker 不會重新 build,導致你跑的仍是舊程式碼。
docker compose up -d --build (加上 --build)
- 啟動前強制重新執行 build。
- 優點:確保 container 使用最新的 Dockerfile 設定與程式碼。
🛠 核心概念
1. Docker Exec (進入容器)
每個 Container 都是一個獨立的執行環境。若需進入容器內部進行除錯或查看檔案,可以使用 exec。
# 格式:docker exec -it [Container ID/Name] [Command]
$ docker exec -it my-container /bin/bash
-i: 保持 STDIN 開啟-t: 分配一個偽終端機 (pseudo-TTY)/bin/bash: 執行的 Shell (有些輕量 image 可能只有/bin/sh)
2. Volumes (資料掛載)
Container 是暫時性的,一旦刪除 (down 或 rm),裡面的資料就會消失。為了持久化資料或方便開發(讓本機修改直接反映在容器內),我們使用 Volumes。
範例:Nginx 靜態網頁伺服器
假設我們想用 Nginx 伺服器顯示本機 ./html/dist 目錄下的網頁:
version: "3.4"
services:
nginx:
image: nginx
container_name: my-nginx
ports:
- "8888:80"
volumes:
# [本機路徑]:[容器內路徑]
- ./html/dist:/usr/share/nginx/html
- 原理:將本機的
./html/dist掛載到容器內的/usr/share/nginx/html。 - 效果:當你修改本機的
index.html,容器內的檔案也會同步改變,瀏覽器重新整理即可看到新內容。
🚀 實戰演練:PostgreSQL 資料庫備份
這是一個實用的自動化備份指令範例,展示如何不進入容器就能執行容器內的工具並將檔案存回本機。
完整指令
docker compose exec -T postgres pg_dump -Fc -U outline outline \
> backups/outline_$(date +%Y%m%d_%H%M%S).dump
指令拆解分析
1. 執行環境
docker compose exec -T postgres
exec: 在執行中的容器執行命令。-T: 關鍵參數。不分配 TTY。當你需要將輸出導向 (redirect) 到檔案或管線 (pipe) 時,必須加上這個參數,否則可能會出現錯誤。postgres:docker-compose.yml中定義的服務名稱。
2. 備份工具
pg_dump -Fc -U outline outline
pg_dump: PostgreSQL 的備份工具。-Fc: 輸出為 Custom Format。優點是已壓縮、可選擇性還原,且需用pg_restore處理。-U outline: 使用outline這個使用者。outline: (最後一個參數) 要備份的資料庫名稱。
3. 輸出存檔
> backups/outline_$(date +%Y%m%d_%H%M%S).dump
>: 標準輸出導向,將容器內pg_dump吐出的資料流,寫入本機檔案。backups/: 本機存放路徑。$(date ...): Shell 變數,自動產生如20251202_091530的時間戳記,避免檔名衝突。