介绍 Docker Compose 服务依赖和健康检查相关知识。
概念介绍
什么是服务依赖?
服务启动有先后顺序,B 依赖 A,如部署 Service 服务一般需要依赖 Database, 这时我们需要先启动数据库,再启动我们的应用程序。
如何使用服务依赖?
在 docker-compose.yml 中指定 depends_on
参数可以指定容器的启动顺序,B 服务要晚于 A 服务启动,则需要在 B 服务配置 depends_on
A 服务。
什么是健康检查?
容器启动后,判断其是否可以正常对外提供服务,不能服务启动了是 up
状态,但是里面的服务一直在报错,这样事实上是启动有问题的,这个就是健康检查。
如何进行健康检查?
容器本身提供的有健康检查,可以在服务启动时,或者 Dockerfile 中指定相关参数, 不过使用更多的还是直接在 docker-compose.yml 中指定。
服务启动时:
|
|
Dockerfile 指定:
|
|
docker-compose 方式指定:
|
|
两者的结合?
我们实际使用中遇到的情况可能是,B 服务依赖 A 服务,但是 A 服务开始启动之后,实际需要耗时一段时间(初始化数据等操作),此时如果直接启动 B 服务,就会报错,所以我们需要在 A 服务启动成功,能对外提供服务时,才开始启动 B 服务。
|
|
如何解决?
在 A 服务中配置健康检查,在 B 服务的服务依赖中配置 A 服务的服务状态为健康。
|
|
具体示例
请注意:此文件仅作为测试使用,无实际意义。
|
|
正常启动日志
|
|
启动过程分析
- 刚开始启动时,docker-mysql8-1 在
Waiting
中。等待启动后的服务检查,docker-tomcat9-1 处于Created
(容器创建了,再等待启动) - docker-mysql8-1 状态为
Healthy
(启动成功,健康检查正常),此时 docker-tomcat9-1 开始启动 - 刚开始查看服务状态时,docker-tomcat9-1 服务的
STATUS
为 (health: starting
) - 过了一段时间后,docker-tomcat9-1 服务的
STATUS
变为 (health
)
健康检查失败日志
我们修改 mysql 的健康检查语句,使其执行失败,查看如果健康检查失败会是什么结果
|
|
|
|
失败日志分析
- 首先启动时,docker-tomcat9-1 一直在等待,docker-mysql8-1 最终创建失败,耗时 50s (
interval 10s
*retries 5
) 左右 - 使用 docker ps -a 可以查看所有的容器状态,可以看到 docker-mysql8-1 为
unhealthy
, docker-tomcat9-1 为Created
并未启动
如何查看分析错误
使用 docker 的 inspect
命令, 在 State.Health.Log
中可以看到相关错误信息。
|
|