Какой интерфейс контейнера (ов) делает Docker сопоставление портов (`-p : `) применить к? - PullRequest
1 голос
/ 10 февраля 2020

К какому интерфейсу контейнера применяется Docker сопоставление портов (-p <host-port>:<container-port>)?

После прочтения документации Docker я не уверен, какой сетевой интерфейс ( s) в контейнере Docker применяется сопоставление портов Docker, подобное (1) и (2).

По умолчанию новый контейнер создается с двумя интерфейсами eth0 и lo, но можно добавить больше.

(1) - сокращение от -p 0.0.0.0:8080:80.

(2) относится к сетевому интерфейсу хоста с IP-адресом 192.168.1.100 и отображает порт хоста. 8080 к порту контейнера 80, но на каком интерфейсе контейнера?

(1) -p 8080:80  Map TCP port 80 in the container to port 8080 on the Docker host.

(2) -p 192.168.1.100:8080:80    Map TCP port 80 in the container to port 8080 on the Docker host for connections to host IP 192.168.1.100.

Делать (1) и (2) сопоставлять порт хоста 8080 с портом контейнера 80 на ВСЕХ интерфейсах контейнера ( 0.0.0.0)? Если, так, где я могу увидеть это в документации, и может ли это поведение быть ограничено указанным c набором контейнерных интерфейсов?

https://docs.docker.com/config/containers/container-networking/

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

TCP-соединения имеют одну начальную точку (IP + порт) и одну конечную точку (IP + порт). Таким образом, переадресация портов может отображаться только на один IP-адрес в контейнере. В частности, сетевой интерфейс моста.

«Может ли это поведение быть ограничено указанным c набором контейнерных интерфейсов», тогда не имеет смысла: по природе TCP существует только один интерфейс это связано с.

Если вы беспокоитесь, что вещи, слушающие 127.0.0.1 внутри контейнера, будут опубликованы c, то не делайте этого; они не будут (и не могут).

https://pythonspeed.com/articles/docker-connection-refused/ содержит несколько диаграмм, которые могут сделать это более ясным.

0 голосов
/ 10 февраля 2020

Do (1) и (2) сопоставляют порт 8080 хоста с портом 80 контейнера на ВСЕХ интерфейсах контейнера (0.0.0.0)

Не совсем. (1) сопоставляет порт хоста 8080 с портом контейнера 80 на всех хостах интерфейсах. (2) сопоставляет порт хоста 8080 на хост интерфейсе с IP-адресом 192.168.1.100 на порт 80 контейнера.

В частности, он что-то делает вместе (копируя с моего компьютера):

iptables -t nat -A PREROUTING -m addrypte --dst-type LOCAL -j DOCKER
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i <bridge docker interface> -p tcp -m tcp --dport 8080 -j DNAT --to-destination <container-IP-address>

In net: ПРОФИЛИРОВАНИЕ traffi c для dport 8080 перенаправляется на IP-адрес контейнера.

Полагаю, вы в замешательстве и предполагаете, что контейнеры имеют несколько интерфейсов. Контейнер имеет (обычно) один интерфейс и подключен к одной docker сети.

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