容器之间可经过 IP,Docker DNS Server 或 joined 容器三种方式通讯。web
从上一节的例子能够得出这样一个结论:两个容器要能通讯,必需要有属于同一个网络的网卡。docker
知足这个条件后,容器就能够经过 IP 交互了。具体作法是在容器建立时经过 --network
指定相应的网络,或者经过 docker network connect
将现有容器加入到指定网络。可参考上一节 httpd 和 busybox 的例子,这里再也不赘述。网络
经过 IP 访问容器虽然知足了通讯的需求,但仍是不够灵活。由于咱们在部署应用以前可能没法肯定 IP,部署以后再指定要访问的 IP 会比较麻烦。对于这个问题,能够经过 docker 自带的 DNS 服务解决。app
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器能够直接经过“容器名”通讯。方法很简单,只要在启动时用 --name
为容器命名就能够了。oop
下面启动两个容器 bbox1 和 bbox2:spa
docker run -it --network=my_net2 --name=bbox1 busyboxcode
docker run -it --network=my_net2 --name=bbox2 busyboxserver
而后,bbox2 就能够直接 ping 到 bbox1 了:部署
使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是没法使用 DNS 的。下面验证一下:it
建立 bbox3 和 bbox4,均链接到 bridge 网络。
docker run -it --name=bbox3 busybox
docker run -it --name=bbox4 busybox
bbox4 没法 ping 到 bbox3。
joined 容器是另外一种实现容器间通讯的方式。
joined 容器很是特别,它可使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间能够经过 127.0.0.1 直接通讯。请看下面的例子:
先建立一个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd
而后建立 busybox 容器并经过 --network=container:web1
指定 jointed 容器为 web1:
请注意 busybox 容器中的网络配置信息,下面咱们查看一下 web1 的网络:
看!busybox 和 web1 的网卡 mac 地址与 IP 彻底同样,它们共享了相同的网络栈。busybox 能够直接用 127.0.0.1 访问 web1 的 http 服务。
joined 容器很是适合如下场景:
不一样容器中的程序但愿经过 loopback 高效快速地通讯,好比 web server 与 app server。
但愿监控其余容器的网络流量,好比运行在独立容器中的网络监控程序。
容器之间的通讯咱们已经搞清楚了,接下来要考虑的是容器如何与外部世界通讯?这将是下一节的主题。