Docker Issue Network Delay

在用自定义Docker网络跑容器的时候发现一个问题:Docker的自定义网络启动会延迟大概40秒!

换句话说就是:

  • 如果你使用自定义网络在一个容器启动时想访问另外一个容器会失败!但是如果你先等待40秒再访问的话就一切正常!
  • 如果你使用自定义网络在一个容器启动时ping另外一个容器会卡住一段时间。

解决:加上启动脚本检测网络是否就绪!

可以用类似下面的脚本检测服务是否就绪,或者干脆检查dmesg消息也可以

until nc -z zk 2181; do echo "waiting for zk to be ready"; sleep 0.5; done

现象

在用自定义Docker网络跑Kafka的时候发现一个现象:zk服务正常,但是 Kafka始终报告连接不上zk

$ docker run --net=br --ip=192.168.33.88 --name=zk -h=zk -d wurstmeister/zookeeper
$ docker run --net=br --ip=192.168.33.91 --name=kf1 -h=kf1 \-e KAFKA_ZOOKEEPER_CONNECT=zk \-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 \-e KAFKA_BROKER_ID=1 \--link zk:zk \-it wurstmeister/kafka

运行后始终报错:

java.net.NoRouteToHostException: No route to hostat sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)

而如果你不用自定义网络的话则一切正常!

$ docker run --name=zk -h=zk -d wurstmeister/zookeeper
$ docker run --name=kf1 -h=kf1 \-e KAFKA_ZOOKEEPER_CONNECT=zk \-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 \-e KAFKA_BROKER_ID=1 \--link zk:zk \-it wurstmeister/kafka

分析

那么问题在哪里呢?经过跟踪后终于发现问题在于Docker的自定义网络启动会延迟大概40秒!需要等容器实例dmesg中出现下列消息的时才能正常访问网络中的其他容器实例,这个等待时间大概是40秒

[ 1077.847733] docker1: topology change detected, propagating

解决

问题找到了,搜索了一圈也没有找到怎么让这个延迟时间消失的解决方法,好吧,用土办法:既然是因为网络还没准备好,那就等它准备好!

可以用类似下面的脚本检测服务是否就绪,或者干脆检查dmesg消息也可以

until nc -z zk 2181; do echo "waiting for zk to be ready"; sleep 0.5; done

那么只要在Docker容器真正开始运行之前先运行上面的脚本检测网络是否就绪就可以了,查了一下wurstmeister/zookeeper正好有一个CUSTOM_INIT_SCRIPT参数可以干这个事,妥了!

$ docker run --net=br --ip=192.168.33.88 --name=zk -h=zk -d wurstmeister/zookeeper
$ docker run --net=br --ip=192.168.33.91 --name=kf1 -h=kf1 \-e KAFKA_ZOOKEEPER_CONNECT=zk \-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kf1:9092 \-e KAFKA_BROKER_ID=1 \-e CUSTOM_INIT_SCRIPT="until nc -z zk 2181; do echo 'waiting for zk to be ready'; sleep 1; done" \--link zk:zk \-it wurstmeister/kafka
waiting for kafka to be ready
waiting for zk service ready
......
[2017-12-11 09:04:51,046] INFO [Partition user_events-0 broker=1] No checkpointed highwatermark is found for partition user_events-0 (kafka.cluster.Partition)
[2017-12-11 09:04:51,047] INFO Replica loaded for partition user_events-0 with initial high watermark 0 (kafka.cluster.Replica)
[2017-12-11 09:04:51,050] INFO [Partition user_events-0 broker=1] user_events-0 starts at Leader Epoch 0 from offset 0. Previous Leader Epoch was: -1 (kafka.cluster.Partition)
[2017-12-11 09:04:51,087] INFO [ReplicaFetcherManager on broker 1] Removed fetcher for partitions user_events-0 (kafka.server.ReplicaFetcherManager)
[2017-12-11 09:04:51,087] INFO [Partition user_events-0 broker=1] user_events-0 starts at Leader Epoch 1 from offset 0. Previous Leader Epoch was: 0 (kafka.cluster.Partition)

另外:

  • 这个方法也适用于启动时需要依赖其他服务就绪的情况,比如等待数据库就绪等
  • 或者某些容器服务初始化时间较长,另外的容器需要等它就绪等

https://github.com/SixQuant/e...

Docker Issue Network Delay(自定义网络启动会延迟大概40秒!)相关推荐

  1. Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    前言 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍容器网络模式, 属于了解范畴,充分了容器的网络模式,更有助于更好的理解Docker的容器之间的访问逻辑. 疑问:为什么要了解容器 ...

  2. Docker 容器互联 --link 和 自定义网络

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  3. Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

    Docker原生网络.自定义网络.Docker容器通信.跨主机容器网络 Docker原生网络 bridge Host none Docker自定义网络 自定义bridge overlay macvia ...

  4. Docker | 自定义网络(网关、子网地址)

    了解 docker network 通过下面的命令来获取帮助 docker network --help Commands:connect Connect a container to a netwo ...

  5. Docker学习-Network网络

    Docker学习-Network网络 一.网络介绍 1.三种网络地址 2.Docker四种网络模式 3.网桥相关命令 二.Docker0网络验证和使用 1.Docker容器默认网络docker0 2. ...

  6. Docker-高级篇(2)-Docker四大网络自定义网络

    文章目录 一.宿主机网络 二.Docker网络 三.网络模式 3.1 bridge模式 3.2 host模式 3.3 none模式 3.4 container模式 四.网络IP生产规则 五.自定义网络 ...

  7. Docker使用自定义网络实现容器互联

    目录 容器互联 步骤 新建网络 连接容器 测试连接 添加已经运行的容器到自定义网络 容器互联 随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来实现互联,而不是使用 ...

  8. Docker 网络(十一)——Docker Multi-host Network

    11 Docker Multi-host Network Docker 多主机网络使用基于VXLAN解决方案在libnetwork和libkv库的基础上,所以这个重叠网络需要一个有效的键-值存储服务在 ...

  9. 容器技术-Docker 网络03-用户自定义网络-网络命令的使用

    基于 Docker18.09.0 Docker 系列文章目录 安装Docker和容器管理 Docker镜像管理 Dockerfile详解 Docker数据卷管理 Docker网络之默认网络 Docke ...

最新文章

  1. JavaScript检测之basevalidate.js
  2. java的线程管理器,QuickThread - Java线程池管理器
  3. 如何修改SAP calendar 里一周开始的第一天
  4. 宏定义与预处理、函数和函数库
  5. dokcer mysql修改编码_默认支持utf8编码的mysql docker镜像
  6. 机器学习实战15-自动编码器
  7. 1-1 软件构造过程中的多维视图
  8. H5+个推实现消息推送服务
  9. 区间DP lightoj 1422
  10. [转] 关于闰年的判断方法
  11. 计算机专业学微机原理与接口技术,信息技术学院计算机科学与技术专业《微机原理与接口技术.doc...
  12. IOS音视频(二)AVFoundation视频捕捉
  13. html5 sha1,js-sha1加密
  14. ES6之Symbol详解
  15. 替身机器人,看我用脑电波控制你
  16. 计算机维修工实操,计算机维修工(三级)操作技能练习题.pdf
  17. 计步器锁屏后依然工作的原理
  18. Cisco RV320未经身份验证的配置导出
  19. 数据分析师招聘情况之python分析
  20. Linux之文件共享

热门文章

  1. MXNet如何生成.lst文件和.rec文件
  2. DaoCloud贾恒:一文搞懂发布现代化
  3. Python分析股票(一)统计股票阶段涨幅
  4. AR.JS/制作标记/虚拟现实/
  5. [自助建站系列]1.如何制作自己的网站-总体建设篇
  6. 服务端编程(四)- 背景知识 - request response 深入介绍
  7. ABLIC发布具有电压监控功能的S-19310/S-19315/S-19316系列汽车LDO稳压器
  8. KBPC2510W-ASEMI焊机专用整流桥KBPC2510W
  9. Linux C read、write、creat、open等函数应用实例
  10. 视频学习|Springboot在线学习系统