Docker - 将 Apache Tomcat 网络服务器连接到 MySQL 服务器
Docker - Connect Apache Tomcat web server to MySQL server
我试图将在 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>
现在的问题是我无法建立与数据库的连接,因为 Docker 公开的环境变量在 Tomcat 环境中无法识别。
有没有办法让 Docker 公开的这些环境变量对 Apache Tomcat 环境可见?
您可以使用 db 的 dns 声明并对引用进行硬编码吗?我认为 /etc/hosts 文件已使用 db 更新,当您 --link 它时它是 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 和注册器,然后你在 DNS srv 记录中获得 ip 和端口。
我不记得 Tomcat 但它应该可以访问变量。您确定 Tomcat 在使用之前评估 url 定义吗?
确实,那些环境变量并没有暴露在 tomcat 是 运行 的内容中。解决方案是基于 tomcat 文件(即 "FROM 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 with this startup script
我试图将在 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>
现在的问题是我无法建立与数据库的连接,因为 Docker 公开的环境变量在 Tomcat 环境中无法识别。
有没有办法让 Docker 公开的这些环境变量对 Apache Tomcat 环境可见?
您可以使用 db 的 dns 声明并对引用进行硬编码吗?我认为 /etc/hosts 文件已使用 db 更新,当您 --link 它时它是 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 和注册器,然后你在 DNS srv 记录中获得 ip 和端口。
我不记得 Tomcat 但它应该可以访问变量。您确定 Tomcat 在使用之前评估 url 定义吗?
确实,那些环境变量并没有暴露在 tomcat 是 运行 的内容中。解决方案是基于 tomcat 文件(即 "FROM 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 with this startup script