繁体   English   中英

Docker 网络:使用“localhost”在 2 个容器之间调用

[英]Docker Network : Call between 2 container with “localhost”

在我们的 docker 实例上,我们在桥模式下的同一 MY_NETWORK docker 网络中有两个容器 A 和 B。 从容器 A,我们使用 url "localhost: xxxx" 调用容器 B。 我们很惊讶,因为尽管 localhost 只涉及调用它的容器,但它仍然有效。

我们想了解这是怎么可能的,因为从我们的角度来看,localhost 关注的是容器本身,而不是同一个 docker 网络的另一个容器?

你有想法吗?

您声称是一种奇怪的行为,我已经演示了一个测试用例以确保这不应该发生另一个是 alpine 容器,它将充当客户端。

docker network create --driver=bridge --subnet=10.10.2.0/24 dedicated
docker run -it -p 40000:80 --network=dedicated nginx sh
docker run -it -p 49001:30000 --network=dedicated alpine sh

如果我们尝试使用docker 网络检查命令检查网络,我们将确保一切正常

[
{
    "Name": "dedicated",
    ...
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "10.10.2.0/24"
            }
        ]
    },
  ...
    "Containers": {
        "2380d57bb0158792531b3d38dde5cecb3e77e96db7c147c0a0f458a895996767": {
            "Name": "amazing_snyder",
            "EndpointID": "83b9ed340f855aae2b6aa76e47546713583657af1090a63f9ddfa2d533036f5a",
            "MacAddress": "02:42:0a:0a:02:02",
            "IPv4Address": "10.10.2.2/24",
            "IPv6Address": ""
        },
        "2506c5bfdac621ff9e88d1594438914ad61acdb38870b7960a34c90412aac13a": {
            "Name": "happy_galois",
            "EndpointID": "b366f502cf48e39e96815bfd0b7ba29f57bea46ec56ee0651dff64e8197ce5c3",
            "MacAddress": "02:42:0a:0a:02:03",
            "IPv4Address": "10.10.2.3/24",
            "IPv6Address": ""
        }
    },
   ...
}
]

现在让我们玩一下,我将使用 curl 和 routetrace 来确定我们是否会到达其他服务器 throw localhost

Curl 使用本地主机测试

/ # curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

如果我们也尝试暴露的端口,它会失败

/ # curl localhost:40000
curl: (7) Failed to connect to localhost port 40000: Connection refused

虽然如果我们尝试服务器 ip 它会成功

/ # curl 10.10.2.2:80
<!DOCTYPE html>
....
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
....

为了确保这是默认行为,我尝试跟踪 localhost:80 和 10.10.2.2:80 以确保 localhost 不会遍历并抛出网桥。

/ # traceroute localhost:80
traceroute to localhost:80 (127.0.0.1), 30 hops max, 46 byte packets
1  localhost (127.0.0.1)  0.023 ms  0.019 ms  0.016 ms

它在使用 IP 时从未离开机器,它使用网桥到达另一台机器。

/ # traceroute 10.10.2.2:80
traceroute to 10.10.2.2:80 (10.10.2.2), 30 hops max, 46 byte packets
1  2380d57bb015.dedicated (10.10.2.2)  0.029 ms  0.023 ms  0.021 ms

我不知道它是如何为您工作的,但我最好的猜测是检查您的容器配置并检查您的网络,这可能会引导您完成某些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM