iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0

一樣先附上這次的說明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介紹的內容都很像

image

這個很明確就是每個service所要使用的image

restart

這個是在說明服務是否要被重啟的設定欄位,根據目前的官方資料,有四種模式:

  • no: 不自動重啟容器(預設值)。
  • on-failure[:max-retries]: 僅在容器因錯誤退出時(exit code 非零)才重啟。可選擇性地設定最大重試次數。
  • always: 容器停止時一律自動重啟。若手動停止,則只會在 Docker daemon 重啟或容器被手動啟動時重啟。
  • unless-stopped: 與 always 類似,但當容器被停止後,即使 Docker daemon 重啟,也不會自動重啟。

port

這個主要是在描述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
  • 如果您想限制只有本機可以存取,則需明確指定 IP:-p 127.0.0.1:8080:80

environment

這個就很單純,就是環境變數,這邊補充一個內容,如果你的環境變數內容有出現yaml不允許出現的內容(比如:在內容的最後),那可以把環境變數改成用等號的方式來設定,並且在前後加上雙引號

environment:
	- "SQLITE_PATH=:memory:"

depends_on

在上方的yaml中已經有在註解中表示depends_on的功能了,但我這邊想再多補充一點
關於depends_on中描述的準備好,僅是container順利啟動,如果專案中還需要準備一些資料(比如要匯入一些sample data,又或是要檢查一些環境)那這時候只有設定depends_on還是不夠,會需要多設定healthcheck的功能,如果想要讓自己的專案更加的穩定,可以多注意一下這塊!!

volumes

volumes可以把他想像成一個隨身碟,我們可以設定一個宿主的空間,讓這個空間可以跟container的某個路徑綁定,這可以達成兩個效果

  1. 當container關閉時,這個硬碟空間的資料不會消失,所以下一次重新開啟container時資料依然存在
  2. 當我們需要將資料在宿主電腦跟container做資料的交換,也可以利用這個volumes

上一篇
Day14-docker-compose簡介
下一篇
Day16-docker-compose(volumes&network)
系列文
開發環境設定指南及工具分享16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言