Docker 容器之间的通信


docker目前支持以下5种网络模式:
  • host 模式 : 与宿主机共享网络,此时容器没有使用网络的namespace,宿主机的所有设备,如Dbus会暴露到容器中,因此存在安全隐患。
  • Bridge 模式(和物理交换机类似) : 默认值。此时docker引擎会创建一个veth对(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包),一端连接到容器实例并命名为eth0,另一端连接到指定的网桥中(比如docker0),因此同在一个主机的容器实例由于连接在同一个网桥中,它们能够互相通信。容器创建时还会自动创建一条SNAT规则,用于容器与外部通信时。如果用户使用了-p或者-Pe端口端口,还会创建对应的端口映射规则。
  • 。。。
默认是桥接模式,网络地址为172.17.0.0/16,同一主机的容器实例能够通信,但不能跨主机通信。

连接方式

  • 方式一:可以通过使用容器的IP地址来通信。这种方式会导致IP地址的硬编码,不方便迁移,并且容器重启后IP地址可能会改变,除非使用固定的IP地址。
  • 方式二:可以通过宿主机的IP加上容器暴露出的端口号来通信。这种方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。
  • 方式三:可以使用容器名,通过docker的link机制通信。这种方式通过docker的link机制可以通过一个name来和另一个容器通信。// 实际上–link机制就是在Docker容器中的/etc/hosts文件中添加了一个ES容器的名称解析。


不同网络间的通信:不同容器都添加一块"链接到同一网络的网卡";就可以通过 IP 访问。

Docker DNS Server,通过容器名(非服务名)通信。但是使用docker DNS有个限制,只能在user-defined网络中使用
// 一个服务中多个任务(容器)容器名称都是一样的,L4 负载均衡