iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
IT Operation

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

Day 23 - PostgreSQL + pgAdmin:用 Compose 一次啟動兩個服務

  • 分享至 

  • xImage
  •  

學習目標

  • 使用 Docker Compose 同時管理多個服務
  • 將 PostgreSQL 與 pgAdmin 寫進同一份 compose.yml
  • 了解 Compose 預設 Network 的作用
  • 使用 pgAdmin 連線 PostgreSQL Container
  • 體會 Docker Compose 管理多個 Container 的方便性

從一個服務增加到兩個服務

Day 22 已經成功使用 Docker Compose 啟動 PostgreSQL。

目前的環境只有:

Docker Compose
      │
      └── PostgreSQL

今天要把之前使用過的 pgAdmin 也放進 Docker Compose,讓資料庫和管理工具可以一起啟動。

完成後會變成:

Docker Compose
      │
      ├── PostgreSQL
      │
      └── pgAdmin

這也是第一次真正使用 Compose 同時管理多個 Container。


修改 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

  pgadmin:
    image: dpage/pgadmin4
    container_name: my-pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@example.com
      PGADMIN_DEFAULT_PASSWORD: admin123
    ports:
      - "8080:80"
    depends_on:
      - postgres

volumes:
  postgres-data:

現在 services 裡面已經有:

postgres
pgadmin

兩個服務。


pgAdmin 的設定

pgAdmin 使用:

image: dpage/pgadmin4

接著設定登入 pgAdmin 使用的帳號與密碼:

environment:
  PGADMIN_DEFAULT_EMAIL: admin@example.com
  PGADMIN_DEFAULT_PASSWORD: admin123

這組帳號是登入 pgAdmin 管理介面使用的,並不是 PostgreSQL 的帳號。

接著設定:

ports:
  - "8080:80"

代表:

localhost:8080
       ↓
pgAdmin Container:80

所以之後可以在瀏覽器輸入:

http://localhost:8080

開啟 pgAdmin。


depends_on 是什麼?

設定中還加入:

depends_on:
  - postgres

代表 pgAdmin 這個服務依賴 PostgreSQL 服務。

Docker Compose 在啟動時會依照服務之間的依賴關係安排啟動順序。

不過要注意,depends_on 主要代表 PostgreSQL Container 已經啟動,不一定代表 PostgreSQL 資料庫已經完全準備好接受連線。


一次啟動兩個服務

設定完成後,在 compose.yml 所在的資料夾執行:

docker compose up -d

接著查看:

docker compose ps

正常情況下會看到:

my-postgres
my-pgadmin

兩個 Container 都正在執行。

原本需要分別建立 PostgreSQL 和 pgAdmin,現在只需要一個指令就能全部啟動。


登入 pgAdmin

開啟瀏覽器進入:

http://localhost:8080

使用剛才設定的:

Email:admin@example.com
Password:admin123

登入 pgAdmin。

登入之後還需要新增 PostgreSQL Server,才能真正連線資料庫。


pgAdmin 要怎麼找到 PostgreSQL?

Day 20 使用安裝在自己電腦上的 pgAdmin 時,Host 填的是:

localhost

但今天不一樣。

現在 pgAdmin 自己也是一個 Container。

如果在 pgAdmin Container 裡填:

localhost

代表的是:

pgAdmin Container 自己

並不是 PostgreSQL Container。

Docker Compose 會替同一個 Compose 專案中的服務建立 Network,因此服務之間可以直接使用 Service Name 找到彼此。

所以 PostgreSQL 的 Host 應該填:

postgres

也就是 compose.yml 裡面的服務名稱。


在 pgAdmin 新增 PostgreSQL Server

登入 pgAdmin 後新增 Server。

可以設定:

Name:Docker PostgreSQL

Connection 則填入:

Host name/address:postgres
Port:5432
Maintenance database:schedule_db
Username:myuser
Password:123456

其中最重要的是:

Host:postgres

整個連線方式變成:

瀏覽器
   │
   ↓
localhost:8080
   │
   ↓
pgAdmin Container
   │
   │ Docker Network
   ↓
postgres:5432
   │
   ↓
PostgreSQL Container

這也實際應用了 Day 9 學過的 Docker Network。


查看資料庫

成功連線後,就可以在 pgAdmin 中找到:

Databases
   │
   └── schedule_db

如果之前的 postgres-data Volume 中已經有建立好的資料,也可以繼續看到原本的 Table。

例如:

schedule_db
   │
   └── Schemas
        └── public
             └── Tables
                  └── employees

代表 PostgreSQL 的資料成功透過 Volume 保存下來。


常見錯誤與修正

  • ❌ pgAdmin 裡的 Host 填 localhost → ✅ 使用 Compose Service Name postgres
  • ❌ 無法開啟 pgAdmin → ✅ 確認 8080:80 Port Mapping
  • ❌ pgAdmin 登入失敗 → ✅ 確認 PGADMIN_DEFAULT_EMAIL 與密碼
  • ❌ PostgreSQL 連線失敗 → ✅ 確認 Username、Password、Database 是否正確
  • ❌ docker compose up 後只有一個服務 → ✅ 使用 docker compose ps 和 docker compose logs 查看狀態

今日小挑戰(可交付)

  • [ ] 在 Compose 中加入 pgAdmin
  • [ ] 使用 docker compose up -d 啟動兩個服務
  • [ ] 使用 docker compose ps 確認狀態
  • [ ] 使用瀏覽器開啟 pgAdmin
  • [ ] 使用 postgres 作為 Host
  • [ ] 成功連線 schedule_db
  • [ ] 在 pgAdmin 中找到 employees Table

DAY23 心得

今天第一次真正感受到 Docker Compose 管理多個 Container 的方便性。原本 PostgreSQL 和 pgAdmin 是分開處理的,現在只需要一份 compose.yml 和一個 docker compose up -d,就可以一次把兩個服務都啟動。

今天另一個比較重要的觀念是 Container 之間不能把 localhost 當成對方。因為 pgAdmin 自己也在 Container 裡,所以 localhost 指的是 pgAdmin 自己,而不是 PostgreSQL。

透過 Compose 建立的 Network,可以直接使用 postgres 這個 Service Name 找到 PostgreSQL。這也讓前面學過的 Docker Network 終於真正應用在多個服務的環境中。

下一步就可以開始讓 Node.js 加入這個環境,嘗試讓自己的程式真正連線 PostgreSQL。


上一篇
Day 22 - 第一個 compose.yml:用 Compose 啟動 PostgreSQL
下一篇
Day 24 - PostgreSQL + Node.js:讓程式連上資料庫
系列文
Docker 新手村:從容器到 PostgreSQL 的實戰之路 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言