Как получить доступ к сервису с запущенным докером с помощью network_mode: "host" с внешнего IP - PullRequest
1 голос
/ 28 июня 2019

Мой сценарий:

У меня есть сервер с IP x.x.x.x, на котором я запускаю экземпляр MongoDB. Я также создаю свой сервис с файлом docker-compose.yml, как показано ниже

version: "3" 
services:  
   myApp:
    image: myApplication
    ports:
      - "8080:8080"
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://localhost:27017/myAppDb

Когда я запускаю docker-compose up, чтобы запустить контейнер, я могу получить доступ к моей службе с моего компьютера через x.x.x.x: 8080

Но проблема в том, что мой сервис не может подключиться к mongoDB по адресу localhost: 27017, потому что они не находятся в одной сети. Поэтому я добавляю опцию network_mode: "host" в мой файл docker-compose. Это решает проблему, мой сервис может подключиться к mongoDB, работающему на моем сервере. Однако я больше не могу получить доступ к своему сервису через x.x.x.x: 8080

Мой вопрос:

Как я могу по-прежнему подключаться к своему сервису через x.x.x.x: 80 с опцией network_mode: "host"? Или есть какой-то способ, которым мне не нужно использовать эту опцию, но мой сервис все еще может подключаться к экземпляру mongoDB?

Примечание: Экземпляр MongoDB устанавливается традиционным способом (yum install mongodb-org) и настраивается таким образом, чтобы к нему можно было получить доступ только через localhost: 27017 (или 127.0.0.1:27107) , Я не знаю почему или как, но так оно и есть, поэтому я не могу изменить строку подключения на mongodb: //x.x.x.x: 27017. Это просто не сработает.

Я также знаю, что могу добавить mongodb в качестве службы в файл docker-compose для достижения своей цели, но я не хочу этого делать, поскольку в моем случае лучше управлять базой данных отдельно.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Кажется, что единственный выход - запустить контейнер myApp в режиме host. В этом режиме услуга должна быть доступна по IP-адресу хоста на порту 8080. Если это не так, это, скорее всего, из-за проблем межсетевого экрана.

Доступ к той же службе возможен в bridge сетевом режиме, так как в этом режиме докер манипулирует правилами iptables для предоставления доступа к контейнерам. Подробнее здесь .

В вашем конкретном случае докер добавляет правило NAT для пересылки входящего трафика через порт 8080 на хосте на порт 8080 на контейнере. Выполнение iptables

iptables -t nat -L

должно вывести правило:

Chain POSTROUTING (policy ACCEPT)
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:http-alt
...
Chain DOCKER (2 references)
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http-alt to:172.17.0.2:8080 

, где 172.17.0.2 - это IP контейнера.

Проблема в режиме host, когда порты публикации отбрасываются, а докер не добавляет никаких правил, разрешающих входящий трафик через порт 8080. Вы должны добавить правило самостоятельно.

Надеюсь, это поможет.

0 голосов
/ 28 июня 2019

Я испытал нечто подобное, но я не использовал docker-compose, но я думаю, что вы могли бы применить тот же метод.

Вместо использования хоста вы создадите свой собственный мост.сеть (https://docs.docker.com/network/bridge/),, и тогда я думаю, что ваша служба должна иметь доступ к mongodb, и вы также должны иметь доступ к mongodb :)

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