一樣先附上這次的說明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
上述這個yaml檔我可以看成把兩個docker container當成一組來進行管理,根據之前介紹的docker的內容可以發現到,這個docker-compose.yaml裡面的用詞跟docker介紹的內容都很像
這個很明確就是每個service所要使用的image
這個是在說明服務是否要被重啟的設定欄位,根據目前的官方資料,有四種模式:
no
: 不自動重啟容器(預設值)。on-failure[:max-retries]
: 僅在容器因錯誤退出時(exit code 非零)才重啟。可選擇性地設定最大重試次數。always
: 容器停止時一律自動重啟。若手動停止,則只會在 Docker daemon 重啟或容器被手動啟動時重啟。unless-stopped
: 與 always
類似,但當容器被停止後,即使 Docker daemon 重啟,也不會自動重啟。這個主要是在描述container內部以及你本身的電腦的哪個port要連起來用的
冒號左邊的部分是宿主的電腦,冒號右邊是container內部的port
舉個例子
如果在port這邊寫上
ports:
- "8000:8080"
這代表的是,宿主電腦的port 8000會連上這個container的port 8080
所以如果要拜訪服務,就要用localhost:8000
來拜訪這個服務
這邊我想特別再介紹這個port的綁定的內容,在 Docker 的 port forwarding 設定中,如果只指定埠號而未指定 IP 位址,預設就是綁定到 0.0.0.0
。
這代表該埠號會監聽主機上所有的網路介面(Network Interfaces),無論是 localhost
(127.0.0.1)、區域網路 IP,或是對外的公開 IP。
例如:
-p 8080:80
等同於 -p 0.0.0.0:8080:80
。-p 127.0.0.1:8080:80
。這個就很單純,就是環境變數,這邊補充一個內容,如果你的環境變數內容有出現yaml不允許出現的內容(比如:
在內容的最後),那可以把環境變數改成用等號的方式來設定,並且在前後加上雙引號
environment:
- "SQLITE_PATH=:memory:"
在上方的yaml中已經有在註解中表示depends_on的功能了,但我這邊想再多補充一點
關於depends_on中描述的準備好,僅是container順利啟動,如果專案中還需要準備一些資料(比如要匯入一些sample data,又或是要檢查一些環境)那這時候只有設定depends_on還是不夠,會需要多設定healthcheck的功能,如果想要讓自己的專案更加的穩定,可以多注意一下這塊!!
volumes可以把他想像成一個隨身碟,我們可以設定一個宿主的空間,讓這個空間可以跟container的某個路徑綁定,這可以達成兩個效果