compose.yml
Day 22 已經成功使用 Docker Compose 啟動 PostgreSQL。
目前的環境只有:
Docker Compose
│
└── PostgreSQL
今天要把之前使用過的 pgAdmin 也放進 Docker Compose,讓資料庫和管理工具可以一起啟動。
完成後會變成:
Docker Compose
│
├── PostgreSQL
│
└── pgAdmin
這也是第一次真正使用 Compose 同時管理多個 Container。
將昨天的 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 使用:
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:
- 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,現在只需要一個指令就能全部啟動。
開啟瀏覽器進入:
http://localhost:8080
使用剛才設定的:
Email:admin@example.com
Password:admin123
登入 pgAdmin。
登入之後還需要新增 PostgreSQL Server,才能真正連線資料庫。
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 後新增 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 保存下來。
localhost → ✅ 使用 Compose Service Name postgres
8080:80 Port MappingPGADMIN_DEFAULT_EMAIL 與密碼docker compose up 後只有一個服務 → ✅ 使用 docker compose ps 和 docker compose logs 查看狀態docker compose up -d 啟動兩個服務docker compose ps 確認狀態postgres 作為 Hostschedule_db
employees Table今天第一次真正感受到 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。