iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

前一天我們撰寫完了 Auth-service 的 dockerfile,今天我們要撰寫 docker-compose,利用 postgreSQL 的官方 image 來啟動資料庫服務,同時也將 auth-service 寫入 docker-compose .yml 中讓我們可以一鍵啟動服務。

docker-compose:一鍵啟動多服務環境

我們在專案根目錄建立 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:

      • 設定資料掛載。
      • 為了在每次重啟服務時仍保留先前新增的資料,這裡使用Named 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 會為所有服務建立一個虛擬網路,在該網路中,可以直接使用服務名稱 作為主機名稱來進行通訊。

服務啟動指令

  1. 透過以下指令執行 docker-compose:

    docker-compose up -d --build
    
    • up:主要指令,意思是「啟動」所有服務。
    • -d:--detach 的縮寫,代表「分離模式」,讓容器在背景運行。
    • --build:在啟動前,強制重新建置 build 區塊中定義的映像檔。
  2. 啟用後終端機此時應該有兩個服務運行,會出現

    https://ithelp.ithome.com.tw/upload/images/20250922/20178099Cj2TN5lvUy.png

    若想確認服務是否持續正常運行,可執行以下指令:

    docker ps
    

    ps 指 Process Status,若希望查看已停止運行的容器,則可加上 -a 參數指定查看所有容器。

  3. 如果想重啟服務,則可以透過以下指令停止並移除當前 docker-compose 啟動的服務:

    docker-compose down
    

    對照終端機結果可以很明顯的看出這個指令會做幾件事情:

    https://ithelp.ithome.com.tw/upload/images/20250922/20178099xiZWVBQAHc.png

    1. 停止 (Stop)docker-compose.yml 所定義並啟動的容器。
    2. 移除 (Remove) 這些已停止的容器。
    3. 移除 (Remove) 這些容器所屬的虛擬網路。

    注意這個指令不會移除綁定的 volume(如 postgres-data),也就是重啟服務後,先前對資料庫新增的內容仍舊存在。如果希望一併移除 volume,請在 docker-compose down 指令後加上參數 -v


今天,我們成功撰寫了 docker-compose.yml,學會了如何一鍵啟動、查看與關閉我們的多容器開發環境。

既然我們的服務已經可以在本機運行了,明天,我們將透過 API 測試工具,對前幾天完成的註冊功能,進行簡單的功能驗證。


上一篇
Day 7:撰寫 Dockerfile
系列文
吃出一個SideProject!8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言