2015-11-12 7 views
2

Я пытаюсь подключиться из одного контейнера докера в другой.контейнер, подключенный к докере, все порты закрыты

  • Контейнер А имеет установлен Derby DB и начал, на порту 3301
  • Контейнер B должен быть подключен к контейнеру

докер файлы выглядеть следующим образом: бака A

FROM java:8 

# Install Derby 
COPY db-derby-10.12.1.1-bin.tar.gz db-derby-10.12.1.1-bin.tar.gz 

RUN mkdir /opt/Apache 
RUN cp db-derby-10.12.1.1-bin.tar.gz /opt/Apache 
RUN tar xzvf /opt/Apache/db-derby-10.12.1.1-bin.tar.gz 

EXPOSE 3301 
CMD ["/db-derby-10.12.1.1-bin/bin/startNetworkServer", "-p 3301"] 

Контейнер B

FROM java:8 

# Install nmap 
RUN apt-get update 
RUN apt-get install -y nmap 
COPY db-derby-10.12.1.1-bin.tar.gz db-derby-10.12.1.1-bin.tar.gz 

RUN mkdir /opt/Apache 
RUN cp db-derby-10.12.1.1-bin.tar.gz /opt/Apache 
RUN tar xzvf /opt/Apache/db-derby-10.12.1.1-bin.tar.gz 
EXPOSE 9080 

я начинаю как контейнер и дать им имена бака A

docker run -it --name derby <image> 

Контейнер B

docker run -it --link derby:derby <image> /bin/bash 

Тогда я прикрепить контейнер B и

ping derby or ping 172.17.0.2 

, который является успешным. Но когда я пытаюсь подключиться к базе данных через дерби Cli инструмента и придания URL, как JDBC

connect 'jdbc:derby://172.17.0.2:3301/testdb;create=true'; 

я получаю отказ в соединении ошибки.

Использование Nmap для сканирования портов результатов контейнера в «Все порты закрыты» , который сбивает с толку, потому что Докер литературы гласит:

Так что же, связывающие контейнеры на самом деле? Вы узнали, что ссылка позволяет контейнеру-источнику предоставлять информацию о себе в контейнер-получатель. В нашем примере получатель, сеть, может получить доступ к информации о источнике db . Для этого Docker создает безопасный туннель между контейнерами, который не должен выставлять какие-либо порты снаружи на контейнере; вы заметите, что когда мы запустили контейнер db , мы не использовали флаги -P или -p. Это большое преимущество использования ссылок: нам не нужно выставлять исходный контейнер, вот базу данных PostgreSQL, в сеть.

Может быть, для меня есть подсказка или решение?

С уважением

ответ

1

порт не открыт, как вы не сказали докер, чтобы открыть его.

EXPOSE в файле Dockerfile инструктирует докер, что контейнер прослушивает указанный порт, но он НЕ открывает этот порт или не выставляет его на хост.

--link также не открывает порты, это преимущество связи, вы можете безопасно соединить 2 контейнера без необходимости открывать порты для хоста.

Итак, для подключения к дерби BD с помощью инструмента командной строки у вас есть 2 варианта.

1) Открыть порт -? (Возможные последствия для безопасности)

При запуске контейнера, вы specificy порт открыть.

docker run -it --name derby -p 3301:3301 <image> 

Приведенное выше будет отображать порт 3301 на контейнере в порт 3301 на хосте.

Затем вы можете использовать IP-адрес хоста и порт 3301 для подключения к этому контейнеру.

2) Подключение к контейнеру непосредственно

Вы можете эффективно SSH, чтобы контейнер и выполнить команду на сам контейнер ...

$ sudo docker exec -it derby bash 

И тогда у вас есть Баш сессии на дерби непосредственно, и может запускать команды на нем.

UPDATE

Для подключения из одного контейнера в другой по ссылке, которую вы можете использовать ENV вары, что Докер выставляет на баллоне о ссылке. http://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#environment-variables

Итак, на контейнере B вы будете иметь варвары ENV, содержащие имя ссылки DERBY.

Таким образом, DERBY_PORT будет IP и PORT для подключения к контейнеру дерби.

Однако, если контейнер «дерби» перезапускается, IP-адрес в ENV var будет устаревшим. Поэтому лучше подключиться к нему по имени своей ссылки.

Docker также устанавливает имена хостов о ссылках, так что вы можете подключиться к контейнеру дерби с

http://derby:3301 

внутри контейнера B

Таким образом, вы можете попробовать ..

connect 'jdbc:derby://derby:3301/testdb;create=true'; 
+0

Хорошо, я попробовал вариант 1, но результат тот же. внутри контейнера B я не могу подключиться к контейнеру A. nmap output: отчет о сканировании Nmap для дерби (172.17.0.2) Host up (0.000077s latency). ГОСУДАРСТВЕННАЯ СЛУЖБА ПОРТА 3301/tcp closed неизвестно MAC Адрес: 02: 42: AC: 11: 00: 02 (Неизвестно) Вариант 2 на самом деле не ясен, не мог бы я выполнить докер с хоста? –

+0

AH!извините, я пропустил понимание, я не знал, что вы выполняете команду из другого контейнера. Когда docker создает ссылку, он также предоставляет кучу ENV vars в контейнере о ссылке. Используя их, вы можете настроить таргетинг на связанный компьютер ... http://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/ –

+0

Итак, в контейнере, с которого вы пытаетесь запустить команду, будет существовать ENV var называется 'DERBY_PORT', и это будет содержать IP-адрес хоста и PORT-ссылки Derby –

1

Хорошо, я решил. Для всех остальных, кто мог бы быть interessted, вам нужно, чтобы начать Дерби с командой

startNetworkServer -h 0.0.0.0 

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

С уважением

Смежные вопросы