赞
踩
docker 启动服务,容器里面变成UP了;但这时,还不能正常对外提供服务,对调用方表现是处于不可用状态,直接报错;
若业务线涉及组件比较多,都是这种启动方式,验证影响业务服务的SLA
为了规避上面的风险,docker在v1.12版本后添加了healthcheck功能,这个功能可以自定义容器监控状态的检测标准。
docker 官方文档 healthcheck部分
Dockerfile reference | Docker Documentation
- healthcheck:
- test: ["CMD-SHELL", "curl -sS 127.0.0.1:9200 || exit 1"] # 检测方式
- interval: 1m30s # 多次检测间隔多久 (default: 30s)
- timeout: 10s # 超时时间 (default: 30s)
- retries: 3 # 尝试次数(default: 3)
- start_period: 40s # 容器启动后多久开始检测 (default: 0s)
Docker 支持以下几种 healthcheck 类型:
dockerfile
HEALTHCHECK CMD curl -f http://localhost/ || exit 1
使用 cURL 对服务指定 URL 进行检查。
dockerfile
HEALTHCHECK CMD-SHELL "curl -f http://localhost/ || exit 1; echo healthy"
使用 Shell 脚本对服务进行检查。
dockerfile
- HEALTHCHECK --interval=30s --timeout=3s \
- HTTP/1.1 GET /actors HTTP/1.1
使用 HTTP GET 请求指定 URL 对服务进行检查。
dockerfile
- HEALTHCHECK --interval=5m --timeout=3s \
- TCP/9200
通过连接指定端口,使用 TCP ping 对服务进行检查。
举个例子:
HEALTHCHECK NONE
总的来说:
CMD 和 CMD-SHELL 是最常用的两种健康检查方式
CMD 和 CMD-SHELL 在 HEALTHCHECK 命令中的区别:
• CMD:
• CMD-SHELL:
举个例子:
CMD:
HEALTHCHECK CMD curl -f http://localhost/ || exit 1
CMD-SHELL:
HEALTHCHECK CMD-SHELL "curl -f http://localhost/ || exit 1; echo healthy"
相同的健康检查命令,CMD 版本只执行一条 curl 命令,CMD-SHELL 版本执行两条命令:
总的来说:
在Dockerfile里定义镜像的healthcheck可以应用用基于这个镜像的所有容器
- # healthcheck
- HEALTHCHECK --interval=5s --timeout=5s \
- CMD curl -sS 'http://localhost:9200' || exit 1
在docker-compose里定义healthcheck 可以针对当前服务下的所有容器进行检测
- healthcheck:
- test: ["CMD-SHELL", "curl -sS 'http://localhost:9200' || exit 1"]
- interval: 5s
- timeout: 5s
- retries: 6
docker-compose yaml文件中添加完healthcheck后,添加服务依赖
注意:condition
属性仅适用于在version: '3.2'
及以上版本的docker-compose
中。
- 在depends_on中,可以通过添加一个condition属性来指定服务之间的启动条件。该condition属性可以接受三个值:
-
- condition: service_started 表示在依赖的服务启动之后,才启动本服务;
- condition: service_healthy 表示在依赖的服务健康检查通过之后,才启动本服务;
- condition: service_completed_successfully 表示在依赖的服务成功执行之后,才启动本服务。
使用实战:
- depends_on:
- mysql:
- condition: service_healthy
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。