【发布时间】:2019-03-28 23:16:28
【问题描述】:
我正在阅读 Jaroslaw Krochmalski 的《面向 Java 开发人员的 Docker 和 Kubernetes》一书,偶然发现了以下示例。作者建议创建一个桥接的myNetwork 网络,然后运行连接到该网络的两个容器(Apache Tomcat 和 BusyBox),如下(命令应在单独的终端会话中运行):
$ docker run -it --name myTomcat --net=myNetwork tomcat
$ docker run -it --net container:myTomcat busybox
作者明确表示“我们希望busybox 容器使用与Tomcat 相同的网络。作为替代方案,我们当然可以使用--net myNetwork 选项明确指定网络名称”。
然后作者提出通过在busybox容器中运行以下命令来检查容器之间的通信:
$ wget localhost:8080
这确实有效,但立即让我感到困惑,因为我们有两个不同的容器,并且不清楚它们为什么通过 localhost 进行通信。事实证明,上面提到的带有--net container:myTomcat 键的命令并没有将容器完全添加到网络中,而是使它在与myTomcat 容器相同的IP 下以某种方式可见。
观察证实了这一点,如果您运行docker network inspect myNetwork,您将看到实际上只有一个容器连接到网络:
[
{
"Name": "myNetwork",
...
"Containers": {
"464ed70a0c31784226dc943bcbcb79f7c4666b9d7825183706505731ac06a9bf": {
"Name": "myTomcat",
"EndpointID": "a4c384f17c6f8e443a430f130093ff6936bb59b1b54d0f056d1f0b4c703c1489",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/16",
"IPv6Address": ""
}
},
...
}
]
相反,如果你运行busybox容器如下:
$ docker run -it --net=myNetwork busybox
通过localhost 的可见性将不起作用,但docker network inspect myNetwork 将显示连接到不同 IP 下网络的两个容器:
[
{
"Name": "myNetwork",
...
"Containers": {
"41c607b78af36cf6512124b6c057ed31997ddd6067a99ae579fe25b53753178e": {
"Name": "vigorous_clarke",
"EndpointID": "9bf6d6a294d885febcfe7f38e388f68af3f8bc7c0334c1dcea13512c3ead23d5",
"MacAddress": "02:42:ac:14:00:03",
"IPv4Address": "172.20.0.3/16",
"IPv6Address": ""
},
"464ed70a0c31784226dc943bcbcb79f7c4666b9d7825183706505731ac06a9bf": {
"Name": "myTomcat",
"EndpointID": "a4c384f17c6f8e443a430f130093ff6936bb59b1b54d0f056d1f0b4c703c1489",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/16",
"IPv6Address": ""
}
},
...
}
]
所以看起来,与作者的说法相反,--net=container:myTomcat 和 --net=myNetwork 键具有完全不同的含义。问题是我找不到关于 --net=container:containerName 表示法的任何文档,所以我不确定它到底是什么意思或它是如何工作的。有人对此有任何见解吗?
【问题讨论】:
-
我在这里提供了一个答案:Why would anyone use the same network namespace for two docker containers?,其中包含指向文档和可能用途的链接。
-
如果您有兴趣了解更多信息,我认为您必须深入了解 linux 进程和“网络命名空间”,这是容器在后台使用的内容。一个很好的视频解释了一些事情是这样的:There is No Such Thing as Container Networking - Kelsey Hightower, Google
-
@tgogos 谢谢!这几乎回答了我的问题。