我正在阅读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
选项显式指定网络名称。” / p>
然后,作者建议通过在busybox容器中运行以下命令来检查容器之间的通信:
$ wget localhost:8080
这确实有效,但立即使我感到困惑,因为我们有两个不同的容器,并且不清楚为什么它们通过本地主机进行通信。事实证明,上面提到的带有--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
表示法的任何文档,所以我不确定它的确切含义或工作方式。有人对此有见识吗?
答案 0 :(得分:0)
根据documentation,--network=container:containerName
具有以下含义:
在网络设置为
container
的情况下,一个容器将共享另一个容器的网络堆栈。 [...]示例,运行带有Redis绑定到本地主机的Redis容器,然后运行redis-cli命令并通过本地主机接口连接到Redis服务器。$ docker run -d --name redis example/redis --bind 127.0.0.1 $ # use the redis container's network stack to access localhost $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
这就是本书示例中busybox
容器可以通过tomcat
访问http://localhost:8080
应用程序的原因。
感谢@tgogos为我指明了正确的方向。