Skip to main content

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 是暫時性的,一旦刪除 (downrm),裡面的資料就會消失。為了持久化資料方便開發(讓本機修改直接反映在容器內),我們使用 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 的時間戳記,避免檔名衝突。

如何還原?

若要使用上述格式的備份檔進行還原:

# 注意:這會覆蓋現有資料庫
docker compose exec -T postgres pg_restore -U outline -d outline backups/yourfile.dump