使用--net = container:containerName键将docker容器附加到另一个容器的网络

问题描述 投票:1回答:1

我正在阅读Jaroslaw Krochmalski撰写的“Docker and Kubernetes for Java Developers”一书,我偶然发现了以下示例。作者建议创建一个桥接的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表示法的任何文档,所以我不确定它究竟是什么意思或它是如何工作的。有没有人对此有任何见解?

docker docker-networking
1个回答
1
投票

根据--network=container:containerNamedocumentation具有以下含义:

将网络设置为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容器可以通过书籍示例中的tomcat访问http://localhost:8080应用程序的原因。

感谢@tgogos指出我正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.