Docker 网络:使用 "localhost" 在 2 个容器之间调用
Docker Network : Call between 2 container with "localhost"
在我们的 docker 实例中,我们有两个容器 A 和 B 在同一个 MY_NETWORK docker 桥接模式网络中。
从容器 A,我们使用 url "localhost: xxxx" 调用容器 B。我们很惊讶,因为尽管 localhost 只涉及调用它的容器,但它仍然有效。
我们想了解这是怎么可能的,因为从我们的观点来看,localhost 关注的是容器本身,而不是同一 docker 网络中的另一个容器?
你有想法吗?
你声称的是一种奇怪的行为,我已经演示了一个测试用例以确保这不应该发生
我已经像你一样实现了网桥,并为其分配了 2 个容器,一个是 nginx 容器,它将充当服务器,另一个是 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 network inspect 命令检查网络,我们将确保一切正常
[
{
"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 来确定我们将到达另一个服务器是否抛出 localhost
使用本地主机进行卷曲测试
/ # 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 以确保本地主机不会遍历抛出网桥。
/ # 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
我不知道它是如何为你工作的,但我最好的猜测是检查你的容器配置并检查你的网络,这可能会导致你做某事。
在我们的 docker 实例中,我们有两个容器 A 和 B 在同一个 MY_NETWORK docker 桥接模式网络中。 从容器 A,我们使用 url "localhost: xxxx" 调用容器 B。我们很惊讶,因为尽管 localhost 只涉及调用它的容器,但它仍然有效。
我们想了解这是怎么可能的,因为从我们的观点来看,localhost 关注的是容器本身,而不是同一 docker 网络中的另一个容器?
你有想法吗?
你声称的是一种奇怪的行为,我已经演示了一个测试用例以确保这不应该发生 我已经像你一样实现了网桥,并为其分配了 2 个容器,一个是 nginx 容器,它将充当服务器,另一个是 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 network inspect 命令检查网络,我们将确保一切正常
[
{
"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 来确定我们将到达另一个服务器是否抛出 localhost
使用本地主机进行卷曲测试
/ # 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 以确保本地主机不会遍历抛出网桥。
/ # 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
我不知道它是如何为你工作的,但我最好的猜测是检查你的容器配置并检查你的网络,这可能会导致你做某事。