美文网首页
docker-compose link 导致服务不可用

docker-compose link 导致服务不可用

作者: 追风骚年 | 来源:发表于2021-06-25 19:04 被阅读0次

问题是这样的,一般我们在写 docker-compose.yaml 中的 service 时,service 之间可以通过 service 名称进行互相访问,如果使用名称进行服务间访问,docker 还会在底层提供负载的作用。

测试1

version: "3"
services:
  busybox:
    image: busybox
    entrypoint: tail -f /dev/null

  who:
    image: containous/whoami
$ docker-compose up -d  # 启动服务
$ docker-compose scale who=3  # 扩容 who 服务
$ docker-compose exec busybox sh # 进入busybox 服务

$ ping who
PING who (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.129 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.118 ms
64 bytes from 172.18.0.4: seq=2 ttl=64 time=0.095 ms
^C
--- who ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.095/0.114/0.129 ms

$ ping who
PING who (172.18.0.5): 56 data bytes
64 bytes from 172.18.0.5: seq=0 ttl=64 time=0.371 ms
64 bytes from 172.18.0.5: seq=1 ttl=64 time=0.131 ms
64 bytes from 172.18.0.5: seq=2 ttl=64 time=0.166 ms
^C
--- who ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.131/0.222/0.371 ms

这里可以看到 docker 的内嵌 dns 为我们的 who 服务作了负载。

测试2

version: "3"
services:
  busybox:
    image: busybox
    entrypoint: tail -f /dev/null
    links:
      - who

  who:
    image: containous/whoami

这里添加了一个 links

$ docker-compose up -d  # 启动服务
$ docker-compose scale who=3  # 扩容 who 服务
$ docker-compose exec busybox sh # 进入busybox 服务

$ ping who
PING who (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.176 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.132 ms
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.122 ms
^C
--- who ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.122/0.143/0.176 ms

$ ping who
PING who (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.090 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.123 ms
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.115 ms
^C
--- who ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.090/0.109/0.123 ms

这里可以看到两次返回的 ip 是一样的,可以测试多次应该是得到都是同一个 ip。

可以再打开一个终端停止刚开始的容器

$ docker stop whoami_busybox_1

然后再去 ping 一下 who 的服务

$ ping who
ping: bad address 'who'

那这里就发生的事情就很奇怪了,居然 ping 不通了。

这里可以推断出 docker compose 启动的时候就已经将 who 服务和它的 ip 写到 busybox 中,所以对于 busybox 来说只会和第一个启动的 who 绑定,也没有走 docker 内嵌的 dns 服务。

很多文章指出是直接将容器名和 ip 写到 /etc/hosts

$ cat /etc/hosts

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.3  32cee21646a5

我这里测试出来的结果是 32cee21646a5 是 busybox的 container id,172.20.0.3 是 busybox 的 ip,这里并没有找到 who 的对应关系,所以网上的一些文章应该是有误的。

我甚至用 tcpdump 去抓网卡对应的dns 解析的包

$ tcpdump -i eth0 udp port 53

$ ping baidu.com  # 可以看到很多 udp 的包
$ ping sv1 # tcpdump 是没有输出的,所以对于内部服务是特殊处理的

但是这个问题终究还是没有找到根本原因,可能需要去 docker 的内嵌 dns 解析的实现中去查找结果。

等后续。。。

相关文章

  • docker-compose link 导致服务不可用

    问题是这样的,一般我们在写 docker-compose.yaml 中的 service 时,service 之...

  • SpringCloud高可用学习

    雪崩效应 基础服务的故障导致的级联故障,最终导致服务的不可用。 形成原因:1、服务提供者不可用2、服务调用者不可用...

  • Hystrix笔记(一)——雪崩效应

    服务雪崩: 服务雪崩效应是一种因服务提供者的不可用导致 服务调用者的不可用,并将不可用 逐渐放大 的过程. 任意服...

  • 熔断限流

    服务雪崩效应: 是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。 原因: 策略:

  • 雪崩效应及常见的容错方案

    雪崩效应 服务雪崩效应就是因为服务提供者不可用,导致服务直接或间接的调用者不可用,最终把不可用的范围不断放大。 常...

  • Spring Cloud Alibaba Sentinel组件

    什么是服务雪崩效应 服务雪崩效应是一种因“服务提供者服务的不可用”(原因)导致“服务调用者服务不可用”(结果),并...

  • 6 SpringCloud中熔断器:Hystrix

    先理解几个定义:服务雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。雪崩原因...

  • 九、Hystrix解决雪崩效应1

    一、什么是雪崩效应。 是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程. 也...

  • Hystrix(熔断器)基本知识

    1. 为什么要有熔断器 当服务出现性能问题时,很容易导致服务宕机,进而导致其他服务不可用,这样一直顺着链路走下去就...

  • Redis Cluster基于Docker的集群搭建

    摘要:Docker 搭建 Redis Cluster,解决单机挂掉导致服务不可用的情况,并通过 docker-co...

网友评论

      本文标题:docker-compose link 导致服务不可用

      本文链接:https://www.haomeiwen.com/subject/gvpoyltx.html