iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
IT Operation

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

Day 22 - 第一個 compose.yml:用 Compose 啟動 PostgreSQL

  • 分享至 

  • xImage
  •  

學習目標

  • 實際使用 compose.yml 建立 PostgreSQL
  • 認識 Compose 中的 services、environment、ports、volumes
  • 使用 docker compose up 啟動 PostgreSQL
  • 學會查看 Compose 的執行狀態與 Logs
  • 使用 docker compose down 關閉環境

正式使用 Compose 建立 PostgreSQL

Day 21 認識了 Docker Compose,也知道它可以把原本很長的 docker run 指令整理到 compose.yml 中。

今天要實際建立一份完整的 PostgreSQL Compose 設定,並從頭啟動資料庫。

首先建立一個資料夾:

postgres-compose

在裡面建立:

compose.yml

最後的結構非常簡單:

postgres-compose
└── compose.yml

撰寫 compose.yml

在 compose.yml 中加入:

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

volumes:
  postgres-data:

這份設定會建立一個 PostgreSQL Container,並同時設定帳號、密碼、Database、Port 與 Volume。


把設定拆開來看

首先是:

services:
  postgres:

services 用來定義 Compose 要管理的服務,而 postgres 是我們設定的服務名稱。

接著:

image: postgres:17

代表使用 PostgreSQL 17 的 Image。

Container 名稱:

container_name: my-postgres

環境變數則是:

environment:
  POSTGRES_USER: myuser
  POSTGRES_PASSWORD: 123456
  POSTGRES_DB: schedule_db

這些就是 Day 15 學過的 PostgreSQL 初始化設定。


設定 Port 與 Volume

接著設定:

ports:
  - "5432:5432"

代表:

我的電腦 5432
      ↓
Container 5432
      ↓
PostgreSQL

再加入 Volume:

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

並在最下面定義:

volumes:
  postgres-data:

這樣 PostgreSQL 的資料就不會只存在 Container 裡面。


啟動 PostgreSQL

完成 compose.yml 後,在相同資料夾開啟終端機:

docker compose up -d

Docker Compose 會依照設定檔自動完成需要的建立與啟動工作。

接著使用:

docker compose ps

查看服務狀態。

如果看到 PostgreSQL 顯示:

Up

就代表啟動成功。


查看 PostgreSQL Logs

如果 PostgreSQL 沒有正常啟動,可以使用:

docker compose logs postgres

查看執行紀錄。

也可以持續查看新的 Log:

docker compose logs -f postgres

如果看到類似:

database system is ready to accept connections

就代表 PostgreSQL 已經準備好接受連線。

要停止持續顯示 Logs,可以按:

Ctrl + C

測試 PostgreSQL

接著可以使用前面學過的 psql:

docker exec -it my-postgres psql -U myuser -d schedule_db

成功後會看到:

schedule_db=#

這代表使用 Compose 建立的 PostgreSQL 已經可以正常使用。

可以再輸入:

\conninfo

查看目前的資料庫連線資訊。


關閉 PostgreSQL

使用完畢後,可以輸入:

docker compose down

這會停止並移除 Container。

之後想再次建立環境,只要回到 compose.yml 所在的資料夾,再執行:

docker compose up -d

就可以重新啟動。

而我們使用的 Named Volume 會繼續保留,因此下次啟動時仍然可以繼續使用原本的 PostgreSQL 資料。


從 docker run 到 Compose

之前需要輸入:

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

現在只需要:

docker compose up -d

真正的差別是複雜的設定已經被保存到:

compose.yml

之後不管重新建立幾次環境,都不需要重新輸入完整參數。


常見錯誤與修正

  • ❌ compose.yml 縮排錯誤 → ✅ YAML 要特別注意空格與階層
  • ❌ PostgreSQL 無法啟動 → ✅ 使用 docker compose logs postgres 查看原因
  • ❌ 5432 已經被使用 → ✅ 先確認是否有其他 PostgreSQL Container 正在執行
  • ❌ 修改帳號密碼後沒有改變 → ✅ 舊 Volume 可能已經完成 PostgreSQL 初始化
  • ❌ 執行指令找不到 Compose 設定 → ✅ 確認目前終端機位於 compose.yml 的資料夾

今日小挑戰(可交付)

  • [ ] 建立 postgres-compose 資料夾
  • [ ] 建立 compose.yml
  • [ ] 設定 PostgreSQL 帳號、密碼與 Database
  • [ ] 設定 Port Mapping
  • [ ] 加入 PostgreSQL Volume
  • [ ] 使用 docker compose up -d 啟動
  • [ ] 使用 docker compose ps 確認狀態
  • [ ] 使用 psql 成功連進 PostgreSQL

DAY22 心得

今天真正從頭使用 compose.yml 建立 PostgreSQL,比起之前直接輸入很長的 docker run 指令,Compose 的方式確實方便很多。

以前建立 Container 時,要自己記住帳號、密碼、Port、Volume 等參數,現在全部都可以直接寫在設定檔裡,只要一個 docker compose up -d 就能把 PostgreSQL 啟動。

做到這裡也發現前面學過的內容其實都慢慢串起來了,從 Image、Container、Port、Volume、環境變數到 PostgreSQL,現在都集中在同一份 Compose 設定裡。下一步就可以加入第二個服務 pgAdmin,看看 Docker Compose 同時管理多個 Container 時真正方便的地方。


上一篇
Day 21 - Docker Compose 是什麼?把複雜指令寫進設定檔
下一篇
Day 23 - PostgreSQL + pgAdmin:用 Compose 一次啟動兩個服務
系列文
Docker 新手村:從容器到 PostgreSQL 的實戰之路 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言