iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0

在前幾篇中,我們介紹了很多關於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 ,並輸入

  • SystemPostgreSQL
  • Serverdb (這裡就是我們定義的服務名稱!)
  • Usernameuser (來自 db 服務的環境變數)
  • Passwordpassword (來自 db 服務的環境變數)
  • Databasemydatabase (來自 db 服務的環境變數)
    並按下登入,就可以看到這個db裡面的內容了!!

下一篇我會說明他每一個項目在做什麼


上一篇
Day13-淺談Dockerfile-ENTRYPOINT與CMD:字串 vs 陣列格式深度解析
下一篇
Day15-docker-compose-簡介-2
系列文
開發環境設定指南及工具分享16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言