Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)

作者: hangge 发布时间: 2019-09-06 浏览: 636 次 编辑

    容器之间可以通过 IPDocker DNS Server 或者 joined 容器这三种方式进行通信,下面分别进行介绍。 

三、容器间的相互通信

1,通过 IP 通信

(1)IP 通信就是直接用 IP 地址来进行通信。两个容器如果需要通过 IP 通信,那么它们就必须处于同一个网络,也就是说要有属于同一个网络的网卡。

(2)如果两个容器不在同一个网络,我们可以为其中一个容器添加另外一个容器的网络,这样它们也就能够通过 IP 通信。

(3)假设我们有两个容器分别挂在 my_net 和 my_net2网络上。

关于自定义网络的创建和使用可以参考我之前写的文章:Docker - 网络使用详解2(创建自定义网络:user-defined)

1
2
docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox


(4)由于两个网络属于不同的网桥是不能通信的,因此我们在第二个容器 bbox2 中 ping 第一个容器 bbox1 的地址会发现是 ping 不通的。

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


(5)要让它们能够通信,我们可以执行如下代码为 bbox2 也添加一个 my_net 网络。

1
docker network connect my_net bbox2


(6)我们再次查看下 bbox2 的网络配置,可以发现它除了 my_net2 网络分配的 ip 外,还拥有 my_net 网络的 ip。再次去 ping 第一个容器 bbox1 的地址会发现可以 ping 通了,说明两个容器可以 IP通信了。

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


2,通过 Docker DNS Server 通信

(1)如果使用的是 user-defined 网络,我们借助 docker daemon 内嵌的 DNS server,容器间可以直接通过“容器名”通信。

使用 docker DNS 的限制:

  • 只能在 user-defined 网络中使用。默认的 bridge 网络是无法使用的。

  • 如果两个容器一开始运行时处于不同的 user-defined 网络,可以通过 docker network connect 命令添加另一个容器的网络(具体操作见上方内容),即可通过“容器名”通信。


(2)这里我们启动两个容器 bbox1 和 bbox2,且它们同属 my_net2 这个自定义网络。

(1)关于自定义网络的创建和使用可以参考我之前写的文章:Docker - 网络使用详解2(创建自定义网络:user-defined)
(2)ubuntu-with-ping 是我构建的一个带有 ping 命令的 Ubuntu 镜像,具体可以查看我之前写的文章:Docker - 构建一个带有ping、ifconfig命令的Ubuntu镜像

1
2
docker run -itd --network=my_net2 --name=ubuntu1 ubuntu-with-ping
docker run -itd --network=my_net2 --name=ubuntu2 ubuntu-with-ping


(3)容器启动后进入第二个容器 ubuntu2,可以直接通过容器名(ubuntu1)来 ping 到第一个容器。

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


3,通过 joined 容器通信

(1)joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。

(2)joined 容器适合以下场景:

  • 不同容器中的程序希望通过 loopback 高效快速地通信,比如 Web Server 与 App Server

  • 希望监控其它容器的网络流量,比如运行在独立容器中的网络监控程序。

(3)下面通过一个简单的样例进行演示。首先我们创建一个 httpd 容器,名字为 web1

1
docker run -it -d --name=web1 httpd


(4)查看 web1 可以看到分配的 IP 是 172.17.0.4

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


(5)然后创建一个 busybox 容器并通过 --network=container:web1 指定 joined 容器为 web1

1
docker run -it --network=container:web1 busybox


(6)查看  busybox 容器中的网络配置信息,可以发现它的 mac 地址和 IP 与web1 的完全一样。

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


(7)由于它们共享了相同的网络栈。busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。

原文:Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)


原文链接:https://www.hangge.com/blog/cache/detail_2476.html