Docker Compose 的相依與疑難排解

Docker 中級

Mike Metzger

Data Engineering Consultant

什麼是相依關係?

  • 相依關係決定資源啟動順序
  • 資源(容器)可能需要其他資源
  • 網站應用範例
    • 資料庫容器 postgresql 必須先啟動

容器相依範例 - postgres

Docker 中級

什麼是相依關係?

  • 相依關係決定資源啟動順序
  • 資源(容器)可能需要其他資源
  • 網站應用範例
    • 資料庫容器 postgresql 必須先啟動
    • 接著是 python_app

容器相依範例 - python_app

Docker 中級

什麼是相依關係?

  • 相依關係決定資源啟動順序
  • 資源(容器)可能需要其他資源
  • 網站應用範例
    • 資料庫容器 postgresql 必須先啟動
    • 接著是 python_app
    • 最後是 nginx 網頁伺服器

容器相依範例 - 完整

Docker 中級

depends_on

  • 使用 depends_on 屬性定義相依
  • 可如範例串接多層相依
  • 也可為單一資源設定多個相依
  • compose.yaml 檔案中的順序不影響結果
services:
  postgresql:
    image: postgresql:latest

python_app: image: custom_app depends_on: - postgresql
nginx: image: nginx/latest depends_on: - python_app
Docker 中級

關閉應用程式

  • 關閉應用會依相反順序進行
  • 先停止 nginx 資源

容器相依範例 - 完整

Docker 中級

關閉應用程式

  • 關閉應用會依相反順序進行
  • 先停止 nginx 資源
  • 接著停止 python_app 資源

容器相依範例 - python_app

Docker 中級

關閉應用程式

  • 關閉應用會依相反順序進行
  • 先停止 nginx 資源
  • 接著停止 python_app 資源
  • 最後停止 postgresql 資源

容器相依範例 - postgres

Docker 中級

其他選項

  • Docker Compose 也提供其他相依選項
  • condition: 用來判定資源何時就緒
    • service_started-資源已正常啟動
      • 預設行為
    • service_completed_successfully-資源已順利完成(如初始設定等)
    • service_healthy-資源符合 healthcheck 定義的條件
services:
  nginx:
    image: nginx/latest
    depends_on:
      python_app:
        condition: service_started

python_app: image: custom_app depends_on: postgresql: condition: service_healthy
Docker 中級

Docker Compose 疑難排解工具

  • Docker Compose 提供更多疑難排解工具
  • docker compose logs-彙整應用中所有資源的輸出
    redis-1  | * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    redis-1  | * Running mode=standalone, port=6379.
    redis-1  | * Server initialized
    redis-1  | * Ready to accept connections tcp
    web-1    | * Serving Flask app 'app.py'
    web-1    |  * Running on all addresses (0.0.0.0)
    web-1    |  * Running on http://172.20.0.2:5000
    web-1    | Press CTRL+C to quit
    
  • docker compose logs <resourcename>
Docker 中級

docker compose top

  • docker compose top 顯示應用內各資源狀態
composetest-redis-1
UID   PID    PPID   C    STIME   TTY   TIME       CMD
999   2767   2726   0    01:16   ?     00:03:27   redis-server *:6379

composetest-web-1
UID    PID    PPID   C    STIME   TTY   TIME       CMD
root   2768   2740   0    01:16   ?     00:00:23   /usr/local/bin/python /usr/local/bin/flask run
Docker 中級

一起來練習吧!

Docker 中級

Preparing Video For Download...