gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:20:05 38 4
gpt4 key购买 nike

我正在阅读 Jaroslaw Krochmalski 所著的《Java 开发人员的 Docker 和 Kubernetes》一书,偶然发现了以下示例。作者建议创建一个桥接myNetwork网络,然后运行连接到该网络的两个容器(Apache Tomcat 和 BusyBox),如下所示(命令应在单独的终端 session 中运行):

$ 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 key 并没有将容器完全添加到网络中,而是使其在与 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根据documentation有以下含义:

With the network set to container a container will share the network stack of another container. [...] Example running a Redis container with Redis binding to localhost then running the redis-cli command and connecting to the Redis server over the localhost interface.

$ 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 为我指明了正确的方向。

关于docker - 使用 --net=container :containerName key 将 docker 容器附加到另一个容器的网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399695/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com