介绍 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 中可以看到相关错误信息。
| |