Docker中Tomcat容器无法访问Postgres容器

3
我有一个带有Postgres的阿尔卑斯Docker,监听地址为“*”,并且正在侦听5432端口,我正在使用它进行部署。
docker run -d --name postgres me/postgres:v1

我的Tomcat容器使用Oracle JRE8,我在其中部署了我的REST Web服务,使用以下内容:
# Set environment
ENV CATALINA_HOME /opt/tomcat

EXPOSE 8080    

# Launch Tomcat on startup
CMD ${CATALINA_HOME}/bin/catalina.sh run
RUN rm -rf ${CATALINA_HOME}/webapps/docs \
    ${CATALINA_HOME}/webapps/examples \
    ${CATALINA_HOME}/webapps/ROOT

# Deploying war file
ADD myapp.war ${CATALINA_HOME}/webapps/ROOT.war

# Restarting server after deploying
CMD ${CATALINA_HOME}/bin/catalina.sh run

"并且部署它使用"
docker run -d -p 8080:8080 --name tomcat --link postgres:postgres me/tomcat:v1

这两个程序都在我的笔记本电脑上执行,IP地址为192.168.x.x,并且我检查了端口是否正在监听。
不幸的是,我的Tomcat Web服务无法使用Postgres服务连接。
jdbc:postgresql://192.168.x.x:5432/dBName

我已经尝试的另一种方法: 我使用以下方式在独立端口上启动了PostgreSQL:

docker run -d -p 5432:5432 --name postgres me/postgres:v1
docker run -d -p 8080:8080 --name tomcat me/tomcat:v1

然后使用。
jdbc:postgresql://192.168.x.x:5432/dBName

and

jdbc:postgresql://localhost:5432/dBName

但是似乎两者都不起作用。
在这两种情况下,我都能看到我的Web服务器在Tomcat管理器中运行,并且我能够访问我的数据库。
psql -h localhost -p 5432 -d dBName -U myUser

以及pgAdmin。
任何对解决此问题的帮助都将不胜感激。
解决方案更新:在使用 --link 时,指向 postgres(即您的 PostgreSQL 容器名称)而不是 IP。
jdbc:postgresql://postgres:5432/dBName

非常感谢 @larsks 指出这一点。

2
如果您正在使用 --link,为什么您的 JDBC URL 中有一个 IP 地址?只需使用链接的主机名 postgres,它将解析为正确的 IP 地址。很少有可能 192.168.anything 实际上是 postgres 容器的地址。 - larsks
有趣,我不知道那个。 我尝试了jdbc:postgresql://postgres:5432/dBName,它非常顺利。 非常感谢larsks。 - Ankit
我建议你们其中一位将答案作为答案输入,这样未来的读者就可以立即看到问题已经解决了。@larsks - Bryan
1个回答

3
在使用 --link 时,请指向 postgres(即您的 postgresql 容器名称),而不是 IP。
jdbc:postgresql://postgres:5432/dBName

因此,为了完整解决方案,请运行您的PostgreSQL和Tomcat容器。

docker run -d --name postgres me/postgresql:v1
docker run -d -p 8080:8080 --name tomcat --link postgres:postgres me/tomcat:v1

(注意,这里我没有为postgres容器指定端口,因为它已经在内部暴露了5432端口,除非你想从主机外面访问它,否则不需要在这里指定端口)

你的服务器war文件将使用上述jdbc地址,当它们链接时,postgres会自动解析到容器的IP地址。

感谢@larsks指出这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接