将docker容器连接到另一个容器';具有--net=container:containerName键的s网络

将docker容器连接到另一个容器';具有--net=container:containerName键的s网络,docker,docker-networking,Docker,Docker Networking,我正在读Jaroslaw Krochalski的《Java开发人员的Docker和Kubernetes》一书,我偶然发现了以下示例。作者建议创建一个桥接的myNetwork网络,然后运行连接到此网络的两个容器(Apache Tomcat和BusyBox),如下所示(命令应在单独的终端会话中运行): 作者特别指出,“我们希望busybox容器使用与Tomcat相同的网络。作为替代方案,我们当然可以使用--net myNetwork选项显式指定网络名称。” 然后,作者建议通过在busybox容器中运

我正在读Jaroslaw Krochalski的《Java开发人员的Docker和Kubernetes》一书,我偶然发现了以下示例。作者建议创建一个桥接的
myNetwork
网络,然后运行连接到此网络的两个容器(Apache Tomcat和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
符号的文档,所以我不确定它到底是什么意思,或者它是如何工作的。有人对此有什么见解吗?

根据以下定义,
--network=container:containerName
具有以下含义:

当网络设置为
container
时,一个容器将共享另一个容器的网络堆栈。[…]示例运行Redis容器并将Redis绑定到localhost,然后运行Redis cli命令并通过localhost接口连接到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
容器可以通过
http://localhost:8080
在本书示例中


感谢@tgogos为我指明了正确的方向。

我在这里提供了一个答案:它有文档链接和可能的用途。如果您有兴趣了解更多信息,我认为您必须深入了解linux进程和“网络名称空间”,这是容器在幕后使用的。下面是一段很好的视频,解释了一些事情:@tgogos谢谢!这基本上回答了我的问题。
$ 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