Docker - 网络使用详解3(容器间的相互通信:IP、容器名、joined容器)
容器之间可以通过 IP、Docker DNS Server 或者 joined 容器这三种方式进行通信,下面分别进行介绍。
(4)由于两个网络属于不同的网桥是不能通信的,因此我们在第二个容器 bbox2 中 ping 第一个容器 bbox1 的地址会发现是 ping 不通的。
(6)我们再次查看下 bbox2 的网络配置,可以发现它除了 my_net2 网络分配的 ip 外,还拥有 my_net 网络的 ip。再次去 ping 第一个容器 bbox1 的地址会发现可以 ping 通了,说明两个容器可以 IP 通信了。
(2)这里我们启动两个容器 bbox1 和 bbox2,且它们同属 my_net2 这个自定义网络。
(3)容器启动后进入第二个容器 ubuntu2,可以直接通过容器名(ubuntu1)来 ping 到第一个容器。
(4)查看 web1 可以看到分配的 IP 是 172.17.0.4:
(5)然后创建一个 busybox 容器并通过 --network=container:web1 指定 joined 容器为 web1:
(6)查看 busybox 容器中的网络配置信息,可以发现它的 mac 地址和 IP 与web1 的完全一样。
三、容器间的相互通信
1,通过 IP 通信
(1)IP 通信就是直接用 IP 地址来进行通信。两个容器如果需要通过 IP 通信,那么它们就必须处于同一个网络,也就是说要有属于同一个网络的网卡。(2)如果两个容器不在同一个网络,我们可以为其中一个容器添加另外一个容器的网络,这样它们也就能够通过 IP 通信。
(3)假设我们有两个容器分别挂在 my_net 和 my_net2网络上。
关于自定义网络的创建和使用可以参考我之前写的文章:Docker - 网络使用详解2(创建自定义网络:user-defined)
docker run -it --network=my_net --name=bbox1 busybox docker run -it --network=my_net2 --name=bbox2 busybox
(4)由于两个网络属于不同的网桥是不能通信的,因此我们在第二个容器 bbox2 中 ping 第一个容器 bbox1 的地址会发现是 ping 不通的。
(5)要让它们能够通信,我们可以执行如下代码为 bbox2 也添加一个 my_net 网络。
docker network connect my_net bbox2
(6)我们再次查看下 bbox2 的网络配置,可以发现它除了 my_net2 网络分配的 ip 外,还拥有 my_net 网络的 ip。再次去 ping 第一个容器 bbox1 的地址会发现可以 ping 通了,说明两个容器可以 IP 通信了。
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镜像
(2)ubuntu-with-ping 是我构建的一个带有 ping 命令的 Ubuntu 镜像,具体可以查看我之前写的文章:Docker - 构建一个带有ping、ifconfig命令的Ubuntu镜像
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 到第一个容器。
3,通过 joined 容器通信
(1)joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。
(2)joined 容器适合以下场景:
- 不同容器中的程序希望通过 loopback 高效快速地通信,比如 Web Server 与 App Server。
- 希望监控其它容器的网络流量,比如运行在独立容器中的网络监控程序。
(3)下面通过一个简单的样例进行演示。首先我们创建一个 httpd 容器,名字为 web1。
docker run -it -d --name=web1 httpd
(4)查看 web1 可以看到分配的 IP 是 172.17.0.4:
docker run -it --network=container:web1 busybox
(6)查看 busybox 容器中的网络配置信息,可以发现它的 mac 地址和 IP 与web1 的完全一样。
(7)由于它们共享了相同的网络栈。busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。