Docker Compose 的依赖与故障排查

Docker 进阶

Mike Metzger

Data Engineering Consultant

什么是依赖?

  • 依赖决定资源的启动顺序
  • 资源(容器)可能需要其他资源
  • 示例 Web 应用
    • 数据库容器 postgresql 必须先启动

容器依赖示例 - postgres

Docker 进阶

什么是依赖?

  • 依赖决定资源的顺序
  • 资源(容器)可能需要其他资源
  • 示例 Web 应用
    • 数据库容器 postgresql 必须先启动
    • 然后启动 python_app

容器依赖示例 - python_app

Docker 进阶

什么是依赖?

  • 依赖决定资源的顺序
  • 资源(容器)可能需要其他资源
  • 示例 Web 应用
    • 数据库容器 postgresql 必须先启动
    • 然后启动 python_app
    • 最后是 nginx Web 服务器

容器依赖示例 - 全部

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 进阶

Passons à la pratique !

Docker 进阶

Preparing Video For Download...