docker network connect my_net httpdconnect命令能够为httpd容器再添加一个my_net网络(假设httpd原来只有默认的bridge网络)。这样上面创建的busybox容器就能与此次connect的httpd容器进行通信。
3.2 Docker DNS Server
通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定IP,部署之后再指定要访问的IP会比较麻烦。对于这个问题,可以通过docker自带的DNS服务解决。
从Docker 1.10 版本开始,docker daemon 实现了一个内嵌的DNS server,使容器可以直接通过“容器名”通信。
方法很简单,只要在启动时用–name为容器命名就可以了。
下面的命令启动两个容器bbox1和bbox2:
docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net --name=bbox2 busybox然后,bbox2就可以直接ping到bbox1了,但是使用docker DNS有个限制,只能在user-defined网络中使用。默认的bridge网络是无法使用的。
3.3 joined 容器
joined 容器是另一种实现容器间通信的方式。joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。host网络使得容器与宿主机共用同一个网络,而jointed是使得两个容器共用同一个网络。
请看下面的例子:
先创建一个httpd容器,名字为web1。
docker run -d -it --name=web1 httpd然后创建busybox容器并通过–network=container:web1指定jointed容器为web1:
docker run -it --network=container:web1 busybox这样busybox和web1的网卡mac地址与IP完全一样,它们共享了相同的网络栈。busybox 可以直接用127.0.0.1访问web1的http服务。
其实也很容易理解,之前的–network参数指定了默认网络或者自定义网络,而此处是指定了一个容器,那么当然意思就是使用这个容器的网络。这也有点类似上一篇文章讲到的共享存储。
joined 容器非常适合以下场景:
不同容器中的程序希望通过loopback高效快速地通信,比如web server与app server。
希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。
其实就是应用于即需要独立而又需要两个容器网络高度一致的场景。
3.4 容器与外部网络的连通性
3.4.1 容器访问外部网络
容器默认是能访问外部网络的。通过NAT,docker实现了容器对外网(此处外网不一定是互联网)的访问。
3.4.2 外部网络访问容器










