[linux] Перенести порт хоста в контейнер докеров


1 Answers

Простым, но относительно небезопасным способом было бы использовать параметр --net=host для docker run --net=host .

Этот параметр делает так, чтобы контейнер использовал сетевой стек хоста. Затем вы можете подключиться к службам, запущенным на хосте, просто используя «localhost» в качестве имени хоста.

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

Например, вы можете протестировать его, выполнив следующую команду, которая предполагает, что ваше изображение называется my_image , ваше изображение включает утилиту telnet , а служба, к которой вы хотите подключиться, находится на порту 25:

docker run --rm -i -t --net=host my_image telnet localhost 25

Если вы решили сделать это таким образом, см. Предупреждение о безопасности на этой странице:

https://docs.docker.com/articles/networking/

В нем говорится:

--net = host - Сообщает Docker пропустить размещение контейнера внутри отдельного сетевого стека. По сути, этот выбор говорит Docker о том, чтобы не контейнерная сеть контейнеров! В то время как контейнерные процессы все равно будут ограничиваться их собственной файловой системой, списком процессов и ограничениями ресурсов, команда быстрого доступа ip добавит вам, что по сети они живут «снаружи» на главном хосте Docker и имеют полный доступ к своим сетевым интерфейсам , Обратите внимание, что это не позволяет контейнеру переконфигурировать сетевой стек хоста, который потребует --privileged = true, но он позволяет контейнерам обрабатывать порты с низким номером, как и любой другой корневой процесс. Он также позволяет контейнеру получать доступ к локальным сетевым сервисам, таким как D-bus. Это может привести к тому, что процессы в контейнере смогут совершать неожиданные действия, такие как перезагрузка компьютера. Вы должны использовать этот параметр с осторожностью.

Question

Возможно ли иметь порты доступа к контейнерам Docker, открытые хостом? Конкретно у меня есть MongoDB и RabbitMQ, работающие на хосте, и я хотел бы запустить процесс в контейнере Docker для прослушивания очереди и (необязательно) записи в базу данных.

Я знаю, что я могу переходить из контейнера в хост (через опцию -p), и у меня есть подключение к внешнему миру (то есть интернету) из контейнера Docker, но я бы не хотел показывать порты RabbitMQ и MongoDB от хозяина до внешнего мира.

EDIT: некоторые разъяснения:

Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT     STATE SERVICE
6311/tcp open  unknown

joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway

Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT     STATE    SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds

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

EDIT : В конце концов я пошел с созданием настраиваемого моста, используя pipework и чтобы службы прослушивали IP-адрес моста. Я пошел с этим подходом, вместо того, чтобы MongoDB и RabbitMQ прослушивали мост докеров, потому что он дает большую гибкость.




Если MongoDB и RabbitMQ запущены на хосте, порт должен быть уже выставлен, поскольку он не находится в Docker.

Вам не нужен параметр «-p», чтобы выставлять порты из контейнера в хост. По умолчанию открыт весь порт. Опция '-p' позволяет вам выставить порт из контейнера за пределы хоста.

Итак, я предполагаю, что вам вообще не нужен «-p», и он должен работать нормально :)






Related