返回 导航

Docker / K8s

hangge.com

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

作者:hangge | 2019-06-28 08:52
    容器之间可以通过 IPDocker DNS Server 或者 joined 容器这三种方式进行通信,下面分别进行介绍。 

三、容器间的相互通信

1,通过 IP 通信

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

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

(3)假设我们有两个容器分别挂在 my_netmy_net2网络上。
关于自定义网络的创建和使用可以参考我之前写的文章:Docker - 网络使用详解2(创建自定义网络:user-defined)
docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox

(4)由于两个网络属于不同的网桥是不能通信的,因此我们在第二个容器 bbox2ping 第一个容器 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)这里我们启动两个容器 bbox1bbox2,且它们同属 my_net2 这个自定义网络。
(1)关于自定义网络的创建和使用可以参考我之前写的文章:Docker - 网络使用详解2(创建自定义网络:user-defined)
(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 容器适合以下场景:

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

(4)查看 web1 可以看到分配的 IP172.17.0.4

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

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

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

全部评论(0)

回到顶部