2016-06-03 2 views
1

Привет, полезные разработчики,Соединительные докерные контейнеры

У меня возникли проблемы с подключением докерных контейнеров. Я построил контейнер докеров-подрывников и контейнер-докер-монго.

Докер запуска -d -p 3343: 3343 -p 4434: 4434 -p 18080: 18080 --name СВН-сервер mamohr/подрывной-край

Докер запуска -p 27017: 27017 --name my- mongo -d mongo

Я могу ударить http://x.x.x.x:18080/ из браузера, но не смог свернуться с экземпляром my-mongo. Я могу поговорить с каждым контейнером с моей машины разработки, но не могу разговаривать из контейнера в контейнер.

Я вижу такие вещи, как --net = bridge, host, ????, но я сбиваюсь с толку.

Пожалуйста, помогите .....

ответ

0

Чтобы вы сразу идете, вы можете начать свои хосты с --net = хост, а затем оба контейнер и хост будут иметь возможность общаться. Или вы можете использовать ссылку (--link) между mongo и другим контейнером.

Существует много объяснений о подключении докеров, и документация докеров будет хорошей отправной точкой для начала.

Прочитайте документацию на https://docs.docker.com/engine/userguide/networking/dockernetworks/

+0

--net = host следует использовать с осторожностью, и это неправильный ответ здесь. – johnharris85

+0

Да, при производстве --net = host не идеален. Но на машине разработки, где могут быть зависимые сервисы, которые не находятся в доксеризе и могут нуждаться в прямом доступе для запуска приложения, IMO все в порядке. ex: запуск локального экземпляра базы данных DB – Shibashis

+0

DB OP находится в контейнере, правда? – johnharris85

0

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

Вот официальное руководство: https://docs.docker.com/compose/

0

Docker контейнеры по умолчанию начала присоединенные к сети моста называется default. Вы можете сделать docker network ls и посмотреть сети, которые у вас есть. Вы также можете create networks with different attributes etc...

Итак, в вашем случае оба ваших контейнера запускаются в одной сети default, а это значит, что они должны иметь возможность общаться друг с другом просто отлично. Фактически, если вы хотите, чтобы ваш сервер SVN мог разговаривать с Mongo (и вам не нужно подключаться к монго с вашего хоста), вам даже не нужно выставлять порты в контейнере Mongo. Контейнеры в той же сети, что и каждый, могут общаться друг с другом просто отлично, если не открываются порты. Экспозиция портов - это возможность подключения к узлу> контейнера.

Итак, какое имя хоста/порт вы используете, когда пытаетесь скручиваться из экземпляра mongo в свой экземпляр SVN? Вы должны использовать svn-server, так как это разрешит контейнер SVN (с использованием встроенного DNS-разрешения Docker).

+0

Я пытаюсь закрутить dockerHost: 18080 из контейнера mongo, который получает возможность не подключиться к хосту. Так что я должен просто завивать svn-server: 18080 – user3066155

+0

Это правильно. – johnharris85

0

заимствования этой схемы из SDN hub, представьте, что C1 вашего СВНА контейнер и C2 вашего Монго контейнер:

Docker network

Оба контейнера соединен с docker0 моста и к внешней сетевым адресам 192.168.50.16 сети.

Для подключения с вашего контейнера Монго, проверьте bridge0 IP-адрес контейнера SVN:

# docker inspect <svn-container-name> 

     "Networks": { 
      "bridge0": { 
       "IPAddress": "172.17.0.19", 
      } 

затем Curl непосредственно это bridge0 IP адрес:

curl http://172.17.0.19:18080/ 
+1

Имена контейнеров могут использоваться для разрешения IP-адреса, если вы используете пользовательский мост, а не 'docker0'. – Matt

0

Прямой контейнер для контейнерных сетей с помощью название контейнера может быть достигнуто с помощью user defined network.

docker network create mynet 
docker run -d --net=mynet --name svn-server mamohr/subversion-edge 
docker run -d --net=mynet --name my-mongo mongo 

docker exec <svn-id> ping my-mongo 
docker exec <mongo-id> ping svn-server 

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

$ docker run -d -p 8080:80 --net=mynet --name sleep busybox nc -lp 80 -e echo here! 
63115ef88664f1186ea012e41138747725790383c741c12ca8675c3058383e68 
$ ss -lntp | grep 8080 
LISTEN  0  128      :::8080     :::*  users:(("exe",pid=6287,fd=4)) 
$ docker run busybox nc <any_host_ip> 8080 
here! 
Смежные вопросы