Docker Сеть: вызов между 2 контейнерами с "localhost" - PullRequest
0 голосов
/ 21 апреля 2020

В нашем экземпляре docker у нас есть два контейнера A и B в одной сети MY_NETWORK docker в режиме моста. Из контейнера A мы вызываем контейнер B, используя URL "localhost: xxxx". Мы удивлены, потому что он работает, несмотря на то, что localhost касается только контейнера, в котором он вызывается.

Мы хотели бы понять, как это возможно, потому что из нашего видения localhost касается самого контейнера, а не другого контейнера та же docker сеть?

У вас есть идея?

1 Ответ

0 голосов
/ 21 апреля 2020

То, что вы утверждаете, является странным поведением, я продемонстрировал тестовый сценарий, чтобы убедиться, что этого не произойдет. Я реализовал сетевой мост точно так же, как вы это сделали, и назначил ему 2 контейнера, один из которых является nginx контейнером, который будет действовать в качестве сервера, а другой - альпийский контейнер, который будет действовать как клиент.

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 Test с использованием 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, чтобы убедиться, что 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

Я не знаю, как это сработало для вас, но я предпочитаю проверьте конфигурацию контейнера и проверьте сеть, которая может привести вас к чему-либо.

...