Docker 容器间通信方法

Docker的网络驱动模型

  • bridge:::Docker中默认的网络驱动模型::,在启动容器时如果不指定则默认为此驱动类型。
  • host:打破Docker容器与宿主机之间的网络隔离,直接使用宿主机的网络环境,该模型仅适用于Docker17.6及以上版本。
  • overlay:可以连接多个docker守护进程或者满足集群服务之间的通信;适用于不同宿主机上的docker容器之间的通信。
  • macvlan:可以为docker容器分配MAC地址,使其像真实的物理机一样运行。
  • none:即禁用了网络驱动,需要自己手动自定义网络驱动配置。
  • plugins:使用第三方网络驱动插件。

在主机上通过命令docker network ls可以查看docker中存在的网络

然后通过命令docker network inspect bridge查看bridge网络的详细配置
注意:
默认的 bridge 网桥连接,容器之间只能通过IP互相通信,无法通过容器名进行通信。
但是 Docker无法保证容器重启后的IP 地址不变,所以更好的方式是可以通过容器名进行通信,这样即时 Docker 容器重启,也不会影响原来的连接配置。

使用容器名进行通信

为了实现不同容器通过容器名或别名的互连,docker提供了以下几种:

  1. 在启动docker容器时加入—link参数,但是目前已经被废弃,废弃的主要原因是需要在连接的两个容器上都创建—link选项,当互连的容器数量较多时,操作的复杂度会显著增加。
  2. 启动docker容器后进入容器并修改/etc/host配置文件,缺点是手动配置较为繁杂。
  3. ::用户自定义bridge网桥::,这是目前解决此类问题的主要方法。

用户自定义网桥(bridge)

自定义bridge相对于使用默认的bridge的主要优势:

  1. 自定义bridge可以为容器化的应用程序提供更好的隔离效果和更好的互通性。其中,更好的隔离效果是针对外界网络,更好的互通性则是指同一bridge下的不同容器之间。
  2. 自定义bridge在容器之间提供了自动DNS解析,不同于默认bridge只能通过IP互连的限制,用户自定义的bridge自动提供了容器间的DNS解析功能,容器间可以通过容器名或别名进行通信。

自定义 bridge

  1. 创建一个名为 ’my-dnet‘ 的网络

创建之后,可以通过 docker network ls 查看刚刚创建的网络

  1. 将某个容器加入 ’my-dnet‘ 网络中
  1. 查看 ’my-dnet‘ 网络详情

到此,我们就可以在不同容器之间使用容器名或别名进行通信。

  1. 断开原来的 bridge 连接

850