2015-04-01 2 views
3

Я пытаюсь подключить веб-сервер, который работает в контейнере Apache Tomcat, к базе данных MySQL, которая запускает другой контейнер. Для этого я использую механизм привязки от Docker.Docker - подключить веб-сервер Apache Tomcat к серверу MySQL

docker run -it --name ${CONTAINER_NAME} --link db:db -p 8080:8080 -d tomcat 

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

Для подключения к веб-приложение, которое выполняется в контейнере Tomcat в базу данных, я использую следующий файл конфигурации:

<Context> 
    <Resource 
    name="jdbc/MYDB" 
    type="javax.sql.DataSource" 
    auth="Container" 
    username="user" 
    password="password" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://${DB_PORT_3306_TCP_ADDR}:${DB_PORT_3306_TCP_PORT}/epcis?autoReconnect=true"> 
    </Resource> 
</Context> 

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

Есть способ сделать эти переменные среды открытыми докером, видимыми для среды Apache Tomcat?

+0

Проверьте, если контейнер mysql подвергается воздействию порта 3306. Затем вы можете ввести контейнер и использовать, например, telnet, чтобы узнать, могут ли контейнеры разговаривать друг с другом. – wsl

+0

Они могут разговаривать друг с другом, я подтверждаю, что с помощью telnet. Проблема в том, что драйвер JDBC не знает значения $ {DB_PORT_3306_TCP_ADDR} и других переменных env. Об ошибке сообщается в журнале tomcat из моего веб-приложения. –

+1

Вы можете использовать свойство env для передачи переменных окружения: https://docs.docker.com/reference/run/#env-environment-variables – wsl

ответ

4

Не могли бы вы использовать объявление dns для db и hard code reference? Я думаю, что файл/etc/hosts обновляется с помощью db, и это ip-адрес, когда вы его связываете. Таким образом, вы могли бы:

<Context> 
    <Resource 
    name="jdbc/MYDB" 
    type="javax.sql.DataSource" 
    auth="Container" 
    username="user" 
    password="password" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql:db:3306/epcis?autoReconnect=true"> 
    </Resource> 
</Context> 

Другой метод, который я использую skydns и регистратором, то вы получите IP и порт в DNS SRV записи.

Я не помню Tomcat, но он должен иметь доступ к переменным. Вы уверены, что Tomcat оценивает определение URL перед его использованием?

+0

Спасибо, Грег, ты прав./Etc/hosts содержит IP-адрес из контейнера db, это решило мою проблему. –

+0

Я попытался использовать этот метод в своем мета-INF/контексте.xml, но я получаю ошибки при запуске tomcat вокруг «mysql: db: 3306», потому что он не разрешает «db» для IP. –

+0

Взгляните на ваш файл/etc/hosts. Он будет содержать неправильный IP-адрес. Если вы пытаетесь подключить к нему другой контейнер, вам необходимо использовать IP-адрес док-машины и внешний порт, который вы определили. – occasl

0

Действительно, эти env vars не отображаются в контуре, в которой работает tomcat. Решение состоит в том, чтобы создать свой собственный Dockerfile на основе кота одной (т.е. «ОТ кота») и создать свой собственный сценарий запуска, где вы проходите соответствующий окр вары в /etc/tomcat/tomcat.conf:

echo DB_PORT_3306_TCP_ADDR=${DB_PORT_3306_TCP_ADDR} >> /etc/tomcat/tomcat.conf 

Для полнофункционального примера tomcat6/postgres см. this Dockerfile с this startup script

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