在前幾篇中,我們介紹了很多關於Dockerfile的相關知識,但這些Dockerfile都是單一個服務而已,如果今天我們需要控制的是好幾個服務的整合專案,那我們應該怎麼做呢? 這時候就輪到 docker compose 出場的時刻了
docker compose提供我們一個管理多個Dockerfile的介面,讓我們可以依照自己的需求,透過docker-compose.yaml這個檔案來定義一個專案中的子服務應該要怎麼被啟動,他的環境變數是什麼,port要怎麼被forward,有什麼檔案要被掛載到服務內等等
今天我們就以最單純的的專案來進行說明
首先,創立一個docker-compose.yaml的檔案
touch docker-compose.yaml
接著將以下的內容放進去
cat << EOF > docker-compose.yaml
# docker-compose.yaml
# 定義 docker-compose 的檔案格式版本,'3.8' 是目前穩定且推薦的版本
version: '3.8'
# 'services' 是最核心的部分,用來定義專案中的各個獨立服務
services:
# 第一個服務,我們取名為 'db'
db:
# 指定這個服務要使用的 Docker image。這裡是使用官方的 PostgreSQL 15 版
image: postgres:15
# restart: always 確保這個容器在退出時會自動重啟,適合資料庫等常駐服務
restart: always
# environment 用來設定容器內的環境變數
# 這裡我們設定了 PostgreSQL 啟動時必要的預設使用者、密碼和資料庫名稱
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
# volumes 用來將主機(host)的資料夾或 volume 掛載到容器(container)內
# 這樣即使容器被刪除,資料也能被保存下來,達到資料持久化的目的
# 這裡我們建立了一個名為 'db_data' 的 volume,並掛載到容器內 PostgreSQL 存放資料的路徑
volumes:
- db_data:/var/lib/postgresql/data
# networks:
# - my_network # 選擇性:如果想自訂網路可以取消註解
# 第二個服務,我們取名為 'adminer'
adminer:
# 指定使用官方的 Adminer image,它是一個輕量化的資料庫管理工具
image: adminer
restart: always
# ports 用來將主機的 port 映射到容器的 port,格式是 '主機PORT:容器PORT'
# 這裡我們將主機的 8080 port 映射到 adminer 容器預設的 8080 port
# 這樣我們就可以透過瀏覽器訪問 http://localhost:8080 來使用 adminer
ports:
- "8080:8080"
# depends_on 用來定義服務啟動的依賴順序
# 這裡設定 adminer 依賴於 db,Compose 會確保先啟動 db 服務,再啟動 adminer
depends_on:
- db
# networks:
# - my_network # 選擇性:如果想自訂網路可以取消註解
# 'volumes' 用來統一定義這個 docker-compose 專案會使用到的 named volumes
# 這樣可以方便管理,且在執行 docker compose down 時不會被預設刪除
volumes:
db_data:
# 'networks' 用來定義專案的網路,讓我們可以更好地隔離不同專案的容器
# 如果不特別定義,Compose 會自動建立一個預設的 network
# networks:
# my_network:
# driver: bridge
EOF
此時只要打開 http://localhost:8080 ,並輸入
PostgreSQL
db
(這裡就是我們定義的服務名稱!)user
(來自 db
服務的環境變數)password
(來自 db
服務的環境變數)mydatabase
(來自 db
服務的環境變數)下一篇我會說明他每一個項目在做什麼