depends_on 解决 docker 容器依赖问题

这篇具有很好参考价值的文章主要介绍了depends_on 解决 docker 容器依赖问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果你经常使用docker-compose启动服务的话,可能会遇到下面的问题:服务 B 依赖服务 A,需要服务 A 先启动,再启动服务 B

举个例子,在部署 kafka 集群的时候,需要启动两个kafka,并使用zookeeper做注册中心,docker-compose.yaml 文件如下

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka_net
  kafka1:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      # 对应 server.properties 中 advertised.listeners 配置
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
      # 对应 server.properties 中 listeners 配置
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka1:/kafka
    networks:
      - kafka_net
  kafka2:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka2
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka2:/kafka
    networks:
      - kafka_net

networks:
  kafka_net:
    driver: bridge

此时会同时启动 3 个容器,zookeeper、kafka1 和 kafka2

$ docker-compose up -d
[+] Running 3/3
 ⠿ Container kafka1     Started                                                                            11.6s
 ⠿ Container kafka2     Started                                                                            11.5s
 ⠿ Container zookeeper  Started                                                                            11.5s

使用docker logs查看kafka1启动日志

$ docker logs kafka1
...
[2023-05-06 02:20:49,851] FATAL [Kafka Server 1], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
java.lang.RuntimeException: A broker is already registered on the path /brokers/ids/1. This probably indicates that you either have configured a brokerid that is already in use, or else you have shutdown this broker and restarted it faster than the zookeeper timeout so it appears to be re-registering.
	at kafka.utils.ZkUtils.registerBrokerInZk(ZkUtils.scala:417)
	at kafka.utils.ZkUtils.registerBrokerInZk(ZkUtils.scala:403)
	at kafka.server.KafkaHealthcheck.register(KafkaHealthcheck.scala:70)
	at kafka.server.KafkaHealthcheck.startup(KafkaHealthcheck.scala:50)
	at kafka.server.KafkaServer.startup(KafkaServer.scala:280)
	at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
	at kafka.Kafka$.main(Kafka.scala:65)
	at kafka.Kafka.main(Kafka.scala)
[2023-05-06 02:20:49,854] INFO [Kafka Server 1], shutting down (kafka.server.KafkaServer)
[2023-05-06 02:20:49,860] INFO [Socket Server on Broker 1], Shutting down (kafka.network.SocketServer)
[2023-05-06 02:20:49,874] INFO [Socket Server on Broker 1], Shutdown completed (kafka.network.SocketServer)
...

日志抛出了个timeout异常,连接zookeeper超时了,这是因为在启动kafka1的时候,zookeeper还没启动完成,kafka1 在连接 zookeeper 的时候,就会报连接超时

这时候我们可以用depends_on来解决容器依赖问题,depends_on表示在启动本容器前,确保depends_on的容器先启动

加上depends_on后的docker-compose.yaml文件如下

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka_net
  kafka1:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      # 对应 server.properties 中 advertised.listeners 配置
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
      # 对应 server.properties 中 listeners 配置
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka1:/kafka
    depends_on:
      - zookeeper
    networks:
      - kafka_net
  kafka2:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka2
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka2:/kafka
    depends_on:
      - zookeeper
    networks:
      - kafka_net

networks:
  kafka_net:
    driver: bridge

再次启动服务

$ docker-compose up -d 
[+] Running 3/3
 ⠿ Container zookeeper  Started                                                                             0.5s
 ⠿ Container kafka2     Started                                                                             0.9s
 ⠿ Container kafka1     Started                                                                             1.0s

docker logs查看kafka启动日志,发现容器正常启动

到这里我们已经解决了容器的启动顺序问题,但是多启动几次会发现,kafka连接zookeeper超时的问题还是会发生,而且是偶发性的,这是为什么呢?查阅资料发现,**depends_on**只是解决容器启动顺序的问题,但是无法保证容器启动完成,或者说并不会等待**zookeeper**就绪就直接启动**kafka**,这时候如果zookeeper还在启动中,kafka就发起连接请求,此时请求就会超时

解决方案是在depends_on中加入condition属性,conditon能使用下面三种状态

  • serveice_started: 容器启动完成
  • service_healthy:容器处于healthy状态,healthy状态的检查依赖healthcheck
  • service_completed_successfully:在启动依赖服务之前,需要确保依赖服务已经成功完成运行

这里我们使用service_healthy,当zookeeper处于healthy状态的时候,再启动kafka

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka_net
  kafka1:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      # 对应 server.properties 中 advertised.listeners 配置
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
      # 对应 server.properties 中 listeners 配置
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka1:/kafka
    depends_on:
      zookeeper:
        condition: service_healthy
    networks:
      - kafka_net
  kafka2:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka2
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka2:/kafka
    depends_on:
      zookeeper:
        condition: service_healthy
    networks:
      - kafka_net

networks:
  kafka_net:
    driver: bridge

启动服务试一下

$ docker-compose up -d
[+] Running 3/4
 ⠿ Network kafka_kafka_net  Created                                                                         0.0s
 ⠿ Container zookeeper      Waiting                                                                         1.0s
 ⠿ Container kafka1         Created                                                                         0.1s
 ⠿ Container kafka2         Created                                                                         0.1s
container for service "zookeeper" has no healthcheck configured

这里提示zookeeper服务没有配置healthcheck,这是因为,docker 只能启动服务,并不知道容器内的进程什么时候处于healthy状态,所以需要我们自己配置健康检查,不同的进程有不同的健康检查方法,检查zookeeper是否正常启动完成,可以执行echo 'stat' | nc localhost 2181 || exit 1命令,命令返回 0 表示容器healthy,返回 1 表示unhealthyhealthy还能配置其他参数,如时间间隔、超时等,完整的配置如下

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka_net
    healthcheck:
      test: echo 'stat' | nc localhost 2181 || exit 1
      interval: 5s
      timeout: 5s
      retries: 6
  kafka1:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      # 对应 server.properties 中 advertised.listeners 配置
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
      # 对应 server.properties 中 listeners 配置
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka1:/kafka
    depends_on:
      zookeeper:
        condition: service_healthy
    networks:
      - kafka_net
  kafka2:
    image: wurstmeister/kafka:2.11-0.11.0.3
    container_name: kafka2
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - ./data/kafka2:/kafka
    depends_on:
      zookeeper:
        condition: service_healthy
    networks:
      - kafka_net

networks:
  kafka_net:
    driver: bridge
$ docker-compose up -d
[+] Running 4/4
 ⠿ Network kafka_kafka_net  Created                                                                         0.0s
 ⠿ Container zookeeper      Healthy                                                                         6.0s
 ⠿ Container kafka1         Started                                                                         6.5s
 ⠿ Container kafka2         Started                                                                         6.4s

可以看到,kafka会等待zookeeper启动,并处于healthy状态,再启动

到这里我们已经彻底解决docker容器依赖问题啦,如果喜欢我的文章的话可以关注公众号:huangxy,不定期分享技术知识文章来源地址https://www.toymoban.com/news/detail-719061.html

到了这里,关于depends_on 解决 docker 容器依赖问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决docker容器中文字符乱码问题

    在命令行中,输入中文出现乱码或者键入错误的情况: 这里我想输入:”中文“,但是出现乱码。 并且,我在之前已经创建好镜像,通过镜像生成了容器。 1.使用locale查看当前容器的系统使用的字符集。 2.使用locale -a查看当前容器的系统支持可以使用的字符集。 3.在一些博

    2024年02月03日
    浏览(57)
  • 解决WSL2占用内存过多问题(Docker on WSL2: VmmemWSL)

    安装完WSL2后,又安装了Docker,使用了一段时间,发现电脑变卡,进一步查看,发现CPU和内存占用过大,如下图: docker仅仅运行了mysql和zk,在关掉docker后,占用内存仍然很大: 然后关掉wsl后,发现内存下降了。 但是,这种解决方案并不满足我的诉求,我想要的结果是:dock

    2024年02月08日
    浏览(48)
  • 【微服务链路追踪】windows下zipkin持久化数据到ES后没有生成依赖关系dependencies问题

    在之前的文章中,我们通过将数据持久化到mysql得到了trace链路信息和依赖信息;当我们将zipkin数据持久化到elasticSearch,在zipkin UI页面却只看到了trace链路信息,没有生成依赖关系dependencies,这是什么原因呢,今天我们就一起一探究竟,把zipkin数据持久化到elasticSearch后的依赖

    2024年02月04日
    浏览(35)
  • 解决docker启动mysql容器失败问题

    声明:我使用的mysql版本为:8.0.21 当我通过docker使用以下命令启动mysql mysql/data 是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。 mysql/log 是数据库主生的log。建议挂载到容器外。 /etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免

    2024年02月11日
    浏览(61)
  • 【docker-compose】解决容器时区问题

            容器内时间比服务器慢8小时         容器时区默认 UTC 0          docker-compose.yaml 中设置时区

    2024年02月12日
    浏览(40)
  • 【IDEA大项目依赖分析卡死-解决方案】Processing build files for dependencies analysis...

    最近一直在研究一个大型项目,在IDEA里面启动调试的时候,IDEA经常会进行Processing build files for dependencies analysis…(处理构建文件进行依赖分析),并且在这个步骤耗时太久甚至直接卡死。经过一些排查找到了解决方案。 IDEA经常会进行Processing build files for dependencies analysis…(

    2024年02月14日
    浏览(56)
  • 解决docker 容器中,中文显示不全,乱码问题

    系统中文乱码的解决办法 1. 安装中文语言 2. 安装语言设置的命令locale 3. 安装中文的相关字体 4. 修改语言的环境变量 4.1 环境变量一 4.2 设置二 5. 正式配置语言 最近在docker上pull下面的Ubuntu镜像运行后发现中文出现了乱码情况,网上搜过很多教程都没有解决,最后,结合多方

    2024年02月15日
    浏览(51)
  • Docker: driver failed programming external connectivity on endpoint xxx 问题分析及解决

    重启容器发现无法正常启动,报错: driver failed programming external connectivity on endpoint xxx 首先理清一下我做了什么操作。我记得在我开启docker后,执行 docker-compose up -d 启动完容器后,发现无法连接 MySQL 容器,经查没有关闭防火墙,未开放3306端口,因此执行 systemctl stop firewalld

    2024年02月16日
    浏览(32)
  • MySQL 出现 which is not functionally dependent on columns in GROUP BY clause;解决方法

    项目跑到一个新服务器上保存了 一个新安装的数据库,出现了问题 具体报错信息如下: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘aigcc.t2.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 问题出现在grou

    2024年02月08日
    浏览(49)
  • docker容器出现Cannot allocate memory问题解决方法

    执行一下命令查看系统pid_max的值(最大进程数) 总进程数超限,需要临时调大pid_max 查看配置进程数 执行以下命令查看系统内部总进程数,命令执行不成功,需要自己安装(yum -y install psmisc) 定位启动进程较多的程序 最大进程数阙值永久生效需修改配置文件

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包