Когда выполнять сопоставление портов на основе host-ip, например "-p host-ip: port: port" - PullRequest
0 голосов
/ 25 июня 2019

Docker предоставляет способ сопоставления портов между контейнером и хостом.

В соответствии с официальной документацией также возможно упоминать host-ip при сопоставлении портов.

-p 192.168.1.100:8080:80 - сопоставить TCP-порт 80 в контейнере с портом 8080 на хосте Docker для соединений с IP-адресом хоста 192.168.1.100.

Я попробовал эту опцию, чтобы выяснить, в чем разница с хостом или без него.ip.

  • Использование только -p 80:80
$ docker run -itd -p 80:80 nginx:alpine
$ curl localhost:80
$ curl 127.0.0.1:80
$ curl 0.0.0.0:80
$ curl 192.168.0.13:80
$ ps -ef | grep docker-proxy
16723 root      0:00 /usr/local/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.1 -container-port 80
$

Все команды curl возвращают вывод.

  • Использование host-ip подобно-p 192.168.0.13:80:80
$ docker run -itd -p 192.168.0.13:80:80 nginx:alpine
$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused
$ curl 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
$ curl 0.0.0.0:80
curl: (7) Failed to connect to 0.0.0.0 port 80: Connection refused
$ curl 192.168.0.13:80 # return output
$ ps -ef | grep docker-proxy
4914 root      0:00 /usr/local/bin/docker-proxy -proto tcp -host-ip 192.168.0.13 -host-port 80 -container-ip 172.17.0.2 -container-port 80
$

Не удалось выполнить все команды curl, кроме 192.168.0.13:80.

Есть ли какие-либо другие отличия, кроме той, о которой я упоминал здесь.

Интересно, когда использовать отображение портов на основе host-ip.Есть ли варианты использования?

1 Ответ

3 голосов
/ 25 июня 2019

Докер-хост может иметь несколько сетевых карт. В центре обработки данных это может быть слишком отдельный трафик, например, управление, хранение и применение / общественность. На вашем ноутбуке это может быть для беспроводных и проводных интерфейсов. Существуют также виртуальные сетевые карты для таких вещей, как loopback (127.0.0.1) и VPN-туннели.

Если вы не укажете IP в команде port publish, по умолчанию docker будет связываться со всеми интерфейсами на хосте. В IPv4 это обычно обозначается как 0.0.0.0, что означает прослушивание на любом интерфейсе (и именно поэтому я не подключаю к этому адресу, потому что нет такой вещи, как подключение к любой IP). С указанным IP-адресом вы вручную указываете, какой интерфейс использовать. Почему вы хотите указать это? Несколько причин, по которым я могу придумать:

  • Прослушивание только 127.0.0.1 для предотвращения внешнего доступа
  • Прослушивание 0.0.0.0 для явного связывания со всеми интерфейсами IPv4 (можно изменить поведение докера по умолчанию, поэтому для некоторых это может быть необходимо).
  • Прослушивание одного физического сетевого адаптера, что позволяет другим сетевым адаптерам связываться с другими службами на том же порту.
  • Прослушивание только на интерфейсах IPv4, если приложение не работает для IPv6.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...