Можно ли иметь порты доступа к контейнеру Docker, открытые хостом? Конкретно у меня на хосте запущены MongoDB и RabbitMQ, и я хотел бы запустить процесс в контейнере Docker для прослушивания очереди и (необязательно) записи в базу данных.
Я знаю, что могу перенаправить порт из контейнера на хост (через опцию -p) и подключиться к внешнему миру (например, к Интернету) из контейнера Docker, но я бы не хотел показывать порты RabbitMQ и MongoDB от хозяина к внешнему миру.
РЕДАКТИРОВАТЬ: некоторые уточнения:
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
Я должен был сделать этот трюк, чтобы получить любое интернет-соединение с контейнером: мой брандмауэр блокирует сетевые подключения от док-контейнера к внешней стороне.
РЕДАКТИРОВАТЬ : В конце концов я пошел с созданием настраиваемого моста с использованием конвейерной связи и заставить службы прослушивать IP-адреса моста. Я пошел с этим подходом вместо того, чтобы MongoDB и RabbitMQ слушали на док-мосте, потому что он дает больше гибкости.
источник
lo
иeth0
.Простой, но относительно небезопасный способ - использовать
--net=host
опциюdocker run
.Эта опция делает так, чтобы контейнер использовал сетевой стек хоста. Затем вы можете подключиться к сервисам, запущенным на хосте, просто используя "localhost" в качестве имени хоста.
Это проще в настройке, потому что вам не нужно настраивать службу для приема соединений с IP-адреса вашего док-контейнера, и вам не нужно будет указывать док-контейнеру конкретный IP-адрес или имя хоста для подключения, просто порт.
Например, вы можете проверить это, выполнив следующую команду, которая предполагает, что ваш образ вызывается
my_image
, ваш образ включаетtelnet
утилиту, а служба, к которой вы хотите подключиться, находится на порту 25:Если вы решите сделать это таким образом, ознакомьтесь с предупреждением о безопасности на этой странице:
https://docs.docker.com/articles/networking/
Это говорит:
источник
--net=host
не работает для разрешения процесса вашего контейнера для подключения к хост-машине с помощьюlocalhost
. Вместо этого ваш контейнер подключается к специальному имени хоста MacOSdocker.for.mac.host.internal
вместоlocalhost
. Для этого не нужно никаких дополнительных параметровdocker run
. Вы можете передать это как env var, используя,-e
если вы хотите, чтобы ваша контейнерная платформа была независимой. Таким образом, вы можете подключиться к хосту, указанному в env var, и перейтиdocker.for.mac.host.internal
на MacOS иlocalhost
Linux.host.docker.internal
см. в документе docdocker run --rm -it --net=host postgres bash
затемpsql -h host.docker.internal -U postgres
Вы также можете создать туннель SSH.
docker-compose.yml
:docker/Dockerfile.tunnel
:config/ssh/config
:Таким образом, он
elasticsearch
имеет туннель к серверу с запущенной службой (Elasticsearch, MongoDB, PostgreSQL) и предоставляет порт 9200 с этой службой.источник
У меня была похожая проблема с доступом к LDAP-серверу из док-контейнера. Я установил фиксированный IP для контейнера и добавил правило брандмауэра.
docker-compose.yml:
Правило iptables:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
Внутри контейнера доступ
dockerhost:portnumberOnHost
источник
Если MongoDB и RabbitMQ работают на хосте, то порт должен быть уже открыт, поскольку он не находится в Docker.
Вам не нужна
-p
опция для предоставления портов от контейнера к хосту. По умолчанию все порты выставлены.-p
Опция позволяет выставить порт из контейнера с внешней стороны хозяина.Итак, я думаю, что вам не нужно
-p
вообще, и это должно работать нормально :)источник