Docker容器配置启动顺序的三种方式

如果对你有帮助希望点赞收藏~

转载请注明出处~

欢迎批评、指点、讨论~

https://blog.csdn.net/L_Open2021/article/details/129901741

目录

1.问题描述

2.问题解决

方法1:通过 depends_on 结合 healthcheck 实现容器顺序启动(强烈推荐!)

 方案2:shell脚本弹窗被依赖(较复杂)

方案3:通过Docker file 设置延时启动(不推荐,伪顺序)


1.问题描述

在微服务项目中,多容器之间存在相关依赖的关系。

B容器启动时会调用A容器部分接口,所以存在B容器会由于A容器而启动失败的情况

2.问题解决


方法1:通过 depends_on 结合 healthcheck 实现容器顺序启动(强烈推荐!)

例:webB容器依赖了webA容器

先来看docker-compose

services:  
  webA:
    restart: always
    environment:
    MYSQL_PWD: 123456
    container_name: webA
    image: webA

    healthcheck:
	 # http://localhost:4000/health 为webA容器指定的健康检查接口
      test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
     # 健康检查的间隔,默认为 30 秒,单位(h/m/s);
      interval: 30s 
	 # 健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,单位(h/m/s);
      timeout: 20s
	 # 当连续失败指定次数后,则将容器状态视为 unhealthy。
      retries: 5

  webB:
    restart: always
    environment:
      MYSQL_PWD: 123456
    container_name: webB
    image: webB
	# webA容器之后启动,并且webA容器的健康状态为healthy
    depends_on:
      webA: 
	    condition: service_healthy

webB容器启动前会根据webA容器的健康状态来判断是否启动,而webA容器的健康状态根据设定的healthcheck中指定的心跳监测接口来确定

服务调用关系是 webA -> webB,我们的服务由于存在token校验机制,就算服务启动成功了,直接调用 [ip:端口]还是会失败【curl: (22) The requested URL returned error: 424】

所以在webA服务中增加了一个开放的可以绕过token校验的接口用于服务心跳监测,从而判断健康状态

webA服务启动时会自动监测健康状态,直到确认为unhealthy时,bgi服务会启动失败

实际案例(顺序 upms -> bgi -> thingsboard):

失败时: 

 等待状态:

成功状态:

 方案2:shell脚本弹窗被依赖(较复杂)

        思路:在容器启动命令执行之前,跑一个shell脚本,通过shell nc 端口探测被依赖容器来确定被依赖的容器是否ready,随后再去启动后者。

        1. 直接手写shell脚本,通过 nc 端口探测。

https://blog.51cto.com/topic/docker-rongqiqidongshunxu.html

        2. github上的一个开源项目 wait-for-it,拆箱即用

https://www.jianshu.com/p/c54899d50d05

方案3:通过Docker file 设置延时启动(不推荐,伪顺序)

思路:根据服务实际启动时间,对每个服务进行合理的延时时间分配 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在使用docker-compose进行容器部署时,可以通过使用depends_on配合健康检查healthcheck来控制容器启动顺序。 depends_on参数可以指定一个或多个服务名称,表示需要先启动这些服务后才能启动当前的服务。健康检查healthcheck可以用来确定一个服务是否已经启动完成,只有当依赖的服务处于健康状态时,才会启动当前的服务。这样可以确保在分布式项目部署中,各个服务按照指定的顺序启动,避免启动失败或出现依赖关系问题。通过配置docker开机自启以及控制启动脚本的执行顺序,可以实现在服务器重启后,docker及所有容器能够自动恢复使用,并且在启动过程中按照需要的顺序启动各个服务。123 #### 引用[.reference_title] - *1* *3* [docker-compose 如何安排容器启动顺序](https://blog.csdn.net/xiaojinran/article/details/127616543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [超简单实用docker设置容器启动顺序](https://blog.csdn.net/qq_51252433/article/details/125655068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值