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

文章介绍了在微服务项目中,如何处理多容器之间的依赖关系以确保正确的启动顺序。推荐使用`depends_on`结合`healthcheck`来实现容器的顺序启动,通过容器自身的健康检查接口判断是否准备好。此外,还提到了使用shell脚本和Dockerfile设置延时启动的方案,但后者不被推荐,因为只是伪顺序启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载请注明出处~

欢迎批评、指点、讨论~

https://blog.youkuaiyun.com/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 设置延时启动(不推荐,伪顺序)

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

### 控制Docker容器启动顺序的最佳实践 在构建和管理多容器应用时,确保各个服务按照正确的依赖关系有序启动至关重要。通过合理配置可以有效解决这个问题。 #### 使用 `depends_on` 定义基本依赖关系 Compose 文件支持使用 `depends_on` 来定义服务之间的启动先后次序。然而需要注意的是,这仅能保证目标服务已经由 Docker 启动,并不意味着它已完全准备好提供服务[^1]。 ```yaml version: '3' services: db: image: postgres web: depends_on: - db ... ``` #### 实现健康检查机制 为了更精确地控制启动流程,在服务内部实现健壮的初始化逻辑非常重要。可以通过设置 `healthcheck` 参数来监控服务状态,只有当服务被标记为 "healthy" 之后才会继续执行后续操作[^2]。 ```yaml version: '3' services: app: healthcheck: test: ["CMD-U user"] interval: 30s timeout: 10s retries: 5 ... ``` #### 编写等待脚本处理复杂场景 对于某些特定情况下的微调需求,则可能需要用到自定义脚本来完成更加复杂的同步工作。比如编写一个简单的 Bash 脚本用于轮询数据库连接直到成功为止再继续运行应用程序。 ```bash #!/bin/bash until psql -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - continuing" exec "$@" ``` 上述方法能够帮助更好地管理和优化多个相互关联的服务间的交互过程,从而提高系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值