Docker - 将Apache Tomcat Web服务器连接到MySQL服务器

时间:2015-04-01 11:07:43

标签: java mysql tomcat docker jndi

我尝试将在Apache Tomcat容器中运行的Web服务器连接到运行另一个容器的MySQL数据库。为了做到这一点,我使用Docker的链接机制。

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

运行容器后,我可以看到容器已链接,环境变量已正确显示。

为了将Tomcat容器中运行的Web应用程序连接到数据库,我使用以下配置文件:

<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>

现在的问题是我无法建立与数据库的连接,因为在Tomcat环境中无法识别Docker公开的环境变量。

有一种方法可以让Docker公开的这些环境变量对Apache Tomcat环境可见吗?

2 个答案:

答案 0 :(得分:4)

你能使用db的dns声明和硬编码引用吗?我认为/ 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和registrator,然后你在DNS srv记录中获得ip和port。

我不记得Tomcat但它应该有权访问变量。你确定Tomcat在使用它之前评估url定义吗?

答案 1 :(得分:1)

事实上,那些环境变量并没有暴露在运行tomcat的情况中。解决方案是基于tomcat创建自己的Dockerfile(即“FROM tomcat”)并创建自己的启动脚本,将相关的env变量传递到/etc/tomcat/tomcat.conf:

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

对于完全正常运行的tomcat6 / postgres示例,请参阅this Dockerfilethis startup script