在docker-compose编排多个容器时,须要按实际状况控制各容器的启动顺序,本文是《docker-compose下的java应用启动顺序两部曲》的第一篇,文中会分析启动顺序的重要性,以及启动顺序有问题时会有什么样的影响,再给出临时解决的和官方推荐的两种解决方案,为下一篇的实战作好铺垫。java
本次实战的环境以下:程序员
在分布式环境中,各服务之间可能存在依赖关系,例如SpringCloud环境中的应用在启动时都会先往注册中心Eurka发起请求,以下图(来自spring官方博客:https://spring.io/blog/2015/07/14/microservices-with-spring ): 从上图可知,若是Eureka的服务不可用,就会影响业务服务的功能;web
version: '3' services: eureka: image: bolingcavalry/eureka:0.0.1-SNAPSHOT container_name: eureka restart: unless-stopped service: image: bolingcavalry/service:0.0.1-SNAPSHOT container_name: service restart: unless-stopped command: sh -c 'java -Xms1g -Xmx1g -cp /app/resources:/app/classes:/app/libs/* com.bolingcavalry.waitforitdemo.ServiceApplication' depends_on: - eureka
另外您可能会说:不要紧,service会自动从新注册,可是在真实环境中,不是每一个服务都有能力去本身解决依赖不可用的问题,例如spring-cloud-config服务若是起不来,依赖它的服务可能会当即中止;redis
version: "2.4" services: web: build: . depends_on: db: condition: service_healthy redis: condition: service_started redis: image: redis db: image: redis healthcheck: test: "exit 0"
从上述编排内容可见:db容器有健康检查,能够肯定db容器的服务是否可用,web容器的<font color="blue">depends_on</font>参数内能够配置<font color="blue">condition</font>,这样就作到了只有redis已经启动而且db的健康检查经过,才会启动web容器; 2. 上述配置看起来彷佛是个不错的方案,在咱们这里,只要给eureka配置要健康检查,再让service容器的<font color="blue">depends_on</font>参数内配置<font color="blue">condition: service_healthy</font>就能够了; 3. 不幸的是:<font color="red">在docker-compose的第三版语法中,取消了condition参数!</font>文档地址是:https://docs.docker.com/compose/compose-file/ ,以下图红框所示: 4. 所以,condition参数看似好用,可是从V3版开始的docker-compose.yml已经再也不支持该参数,不能做为标准的解决方案;spring
以下图红框所示,docker官方推荐使用<font color="blue">wait-for-it.sh</font>脚原本解决问题,地址:https://docs.docker.com/compose/startup-order/ : 至此,本篇已经分析了docker-compose下容器启动顺序的问题,下一篇文章,咱们用SpringCloud应用来作实战,将其作到在docker-compose下有序启动;docker
若是您对docker容器健康检查有兴趣,能够参考如下文章:app