Почему 0.0.0.0 работает, а localhost или 127.0.01 нет - PullRequest
1 голос
/ 18 мая 2019

У меня есть сервер grpc-go, работающий в контейнере Docker, прослушивающий 0.0.0.0:8080. Я обнаружил, что это работает после сбоев при прослушивании localhost или 127.0.0.1 в контейнере Docker - и он не работает только в Docker-контейнере, если я не запускаюсь на той же машине.

Также простой веб-сервер работал, прослушивая localhost или 127.0.0.1.

Я обнаружил, что 0.0.0.0 прослушивает любой сетевой адаптер, но не нашел других объяснений.

Ну, проблема решена - но я ищу объяснение - вы знаете?

1 Ответ

3 голосов
/ 18 мая 2019

Работа в сети - это одно из пространств имен в Docker, аналогичное пространствам имен PID и файловой системы.Если вы убьете pid 1 внутри контейнера, это убьет процесс внутри контейнера, а не systemd / init на хосте (если вы не переопределите пространство имен).И если вы rm -rf /bin внутри контейнера, это удаляет файлы из этого контейнера, а не с хоста (если у вас нет монтирования тома).Точно так же сеть обратной связи (localhost или 127.0 0.1) в пространстве имен относится только к этому пространству имен, а не к хосту.

Думая об этом на более высоком уровне, петля на хосте доступна только с этого хоста, выне может получить к нему доступ с другого хоста или внешнего балансировщика нагрузки.Работа в пространстве имен работает очень похоже.Обратная петля внутри контейнера может быть достигнута другими процессами внутри того же сетевого пространства имен, но не контейнерами в других пространствах имен, а не с хоста с переадресацией портов, так как он пересылается на интерфейс виртуальной сети, подобно тому, как внешний балансировщик нагрузки пересылается насетевой интерфейс хоста.

...