前一天我們撰寫完了 Auth-service 的 dockerfile,今天我們要撰寫 docker-compose,利用 postgreSQL 的官方 image 來啟動資料庫服務,同時也將 auth-service 寫入 docker-compose .yml 中讓我們可以一鍵啟動服務。
我們在專案根目錄建立 docker-compose.yml
,內容如下:
services:
# --- PostgreSQL Service Definition ---
postgres:
image: postgres:15
container_name: two-hands-postgres
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: auth_db
ports:
- "5432:5432"
volumes:
# 這裡參考下面頂層宣告的 'postgres-data'
- postgres-data:/var/lib/postgresql/data
# --- Auth Service Definition ---
auth-service:
build:
context: .
dockerfile: ./auth-service/Dockerfile
container_name: two-hands-auth-service
depends_on:
- postgres
ports:
- "8081:8081"
environment:
DB_URL: jdbc:postgresql://postgres:5432/auth_db
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
# 正確:這個 volumes 區塊必須和 services 區塊對齊,都在最外層
volumes:
postgres-data:
docker-compose file是以yaml語法進行撰寫,因此需要特別注意縮排。
services
: 所有要啟動的獨立服務 (容器) ,都必須定義在這個區塊底下。volumes
: 在最外層宣告 Named Volumes 的地方。在這裡宣告後,services 區塊中的容器才可以 ref (如:postgres-data:/var/lib/postgresql/data) 。postgres
服務:
image
:指定這個服務要使用的 Docker 映像檔。這裡我們直接使用 Docker Hub 上的官方 postgres 映像檔,並指定版本為 15。
container_name
: 用來為容器命名,方便我們管理和辨識。
environment
: 設定要傳遞到容器內的環境變數。官方的 postgres
映像檔會讀取這些特定的環境變數,來進行初次的資料庫初始化:
POSTGRES_USER
: 設定資料庫的使用者名稱。POSTGRES_PASSWORD
: 設定該使用者的密碼。POSTGRES_DB
: 設定要自動建立的資料庫名稱。${DB_USERNAME}
這種寫法會讓 Docker Compose 自動去讀取專案根目錄下的 .env
檔案,將機敏資訊與設定檔分離。
ports
:端口映射 (Port Mapping),格式為 "本機端口:容器端口"
。以此例來說,就是將我們本機電腦的 5432 port**,映射到容器內部的 5432 port。
volumes
:
/var/lib/postgresql/data
路徑,掛載到一個名為 postgres-data
的 Docker Volume 上。這樣即使我們刪除並重建 postgres
容器,資料依然會被保留下來。auth-service
服務:
build
:告訴 Docker Compose 這個服務不是直接使用現成的映像檔,而是需要透過 Dockerfile build 成自訂的 image。
context: .
:設定建置的上下文 (Build Context) 為當前目錄(docker-compose.yml
所在的目錄)。dockerfile
:明確指定 Dockerfile
的相對路徑。depends_on
: 定義服務之間的啟動順序。在此我們要確保 postgres
容器會比 auth-service
先啟動。environment.DB_URL
: 這裡可以直接使用 postgres
而不是 localhost
。因為 Docker Compose 會為所有服務建立一個虛擬網路,在該網路中,可以直接使用服務名稱 作為主機名稱來進行通訊。透過以下指令執行 docker-compose:
docker-compose up -d --build
啟用後終端機此時應該有兩個服務運行,會出現
若想確認服務是否持續正常運行,可執行以下指令:
docker ps
ps 指 Process Status,若希望查看已停止運行的容器,則可加上 -a
參數指定查看所有容器。
如果想重啟服務,則可以透過以下指令停止並移除當前 docker-compose 啟動的服務:
docker-compose down
對照終端機結果可以很明顯的看出這個指令會做幾件事情:
docker-compose.yml
所定義並啟動的容器。注意這個指令不會移除綁定的 volume(如 postgres-data),也就是重啟服務後,先前對資料庫新增的內容仍舊存在。如果希望一併移除 volume,請在 docker-compose down 指令後加上參數 -v
。
今天,我們成功撰寫了 docker-compose.yml
,學會了如何一鍵啟動、查看與關閉我們的多容器開發環境。
既然我們的服務已經可以在本機運行了,明天,我們將透過 API 測試工具,對前幾天完成的註冊功能,進行簡單的功能驗證。