iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
IT Operation

Docker 新手村:從容器到 PostgreSQL 的實戰之路系列 第 22 篇

Day 21 - Docker Compose 是什麼?把複雜指令寫進設定檔

  • 分享至 

  • xImage
  •  

學習目標

  • 認識 Docker Compose 是什麼
  • 了解為什麼需要 Docker Compose
  • 認識 compose.yml 的基本結構
  • 學會使用 Docker Compose 啟動與停止服務
  • 將原本的 docker run 指令改寫成 Compose

為什麼需要 Docker Compose?

前面使用 Docker 建立 PostgreSQL 時,我們輸入過這樣的指令:

docker run --name my-postgres -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=123456 -e POSTGRES_DB=mydb -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres

雖然一行指令就可以建立 PostgreSQL,但隨著設定越來越多,指令也會越來越長。

如果之後還要加入:

PostgreSQL
pgAdmin
Node.js

每個服務都要輸入不同的 docker run,管理起來就會變得比較麻煩。

這時候就可以使用 Docker Compose。


Docker Compose 是什麼?

Docker Compose 可以把 Container 的設定寫在一個 YAML 設定檔中。

現在常見的檔案名稱是:

compose.yml

原本寫在 docker run 裡面的:

Image
Container Name
Port
Environment
Volume

都可以整理到 compose.yml 中。

可以簡單理解成:

原本
docker run + 很多參數

        ↓

Docker Compose

        ↓

compose.yml

這樣之後就不需要每次重新輸入一大串指令。


第一個 compose.yml

先建立一個:

compose.yml

接著寫入:

services:
  postgres:
    image: postgres
    container_name: my-postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

這份設定其實就是把之前的 docker run 指令拆開來寫。


compose.yml 基本結構

首先:

services:

代表要管理的服務。

接著:

postgres:

是我們替這個服務設定的名稱。

使用:

image: postgres

指定 PostgreSQL Image。

Container 名稱則是:

container_name: my-postgres

環境變數:

environment:
  POSTGRES_USER: myuser
  POSTGRES_PASSWORD: 123456
  POSTGRES_DB: mydb

Port Mapping:

ports:
  - "5432:5432"

Volume:

volumes:
  - postgres-data:/var/lib/postgresql/data

可以發現這些內容其實前面都已經學過,只是現在改成 YAML 的方式集中管理。


使用 Docker Compose 啟動

在 compose.yml 所在的資料夾開啟終端機,輸入:

docker compose up -d

其中:

docker compose up → 建立並啟動服務
-d                → 在背景執行

完成後可以使用:

docker ps

查看 PostgreSQL Container 是否正常執行。

也可以使用:

docker compose ps

查看目前 Compose 管理的服務。


停止 Docker Compose

如果想停止服務,可以輸入:

docker compose down

這會停止並移除 Compose 建立的 Container 與 Network。

不過一般情況下,已建立的 Named Volume 不會因為單純執行 docker compose down 就一起刪除。

如果使用:

docker compose down -v

才會連 Compose 管理的 Volume 一起移除,因此操作資料庫時要特別注意。


docker run 與 Docker Compose

兩種方式都可以建立 Container。

docker run
    ↓
適合快速建立單一 Container

Docker Compose
    ↓
適合管理多個服務與較複雜的設定

目前只有 PostgreSQL 時差異可能還不明顯,但之後加入 pgAdmin、Node.js 後,Docker Compose 的方便之處就會更加明顯。


常見錯誤與修正

  • ❌ YAML 縮排錯誤 → ✅ 注意每一層的空格
  • ❌ 找不到 compose.yml → ✅ 確認終端機位於正確資料夾
  • ❌ 5432 Port 被占用 → ✅ 檢查是否已有 PostgreSQL Container 正在使用
  • ❌ docker compose up 後服務沒有啟動 → ✅ 使用 docker compose logs 查看錯誤
  • ❌ 誤用 docker compose down -v → ✅ 刪除 Volume 前先確認資料是否需要保留

今日小挑戰(可交付)

  • [ ] 建立第一個 compose.yml
  • [ ] 將 PostgreSQL 設定寫入 Compose
  • [ ] 使用 docker compose up -d 啟動服務
  • [ ] 使用 docker compose ps 查看狀態
  • [ ] 使用 docker compose down 停止服務
  • [ ] 理解 docker run 與 Docker Compose 的差別

DAY21 心得

今天第一次接觸 Docker Compose,原本以為又要學一套新的 Docker 操作方式,但實際寫過 compose.yml 後,發現裡面的內容幾乎都是前面已經學過的 Image、Port、Volume 和 Environment,只是換成設定檔的方式整理起來。

相比之前很長的 docker run 指令,我覺得 Compose 看起來清楚很多,而且之後只要使用 docker compose up -d 就可以把設定好的服務啟動。

目前 Compose 裡面只有 PostgreSQL,還看不太出管理多個 Container 的優勢。下一步會把 pgAdmin 也加入 compose.yml,嘗試一次啟動 PostgreSQL 和 pgAdmin,讓整個資料庫開發環境更完整。


上一篇
Day 20 - pgAdmin:用圖形化介面管理 PostgreSQL
下一篇
Day 22 - 第一個 compose.yml:用 Compose 啟動 PostgreSQL
系列文
Docker 新手村:從容器到 PostgreSQL 的實戰之路 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言