Docker – 同一主机中的Tomcat和PostgreSQL容器 – 没有路由到主机

我已经在Tomcat上运行了一个Web应用程序,并使用该命令启动了容器,

docker run -d -p 8080:8080 tveuser/tve-repository:tve-services 

我也使用以下命令在同一台主机上运行PostgreSQL容器:

 docker run -d -p 80:80 -p 5432:5432 tveuser/tve-repository:tve-postgresql 

我证实PostgreSQL是通过使用phpPgAdmin运行的,但是无法通过tomcat连接到它。 “docker ps”也告诉我,这两个容器已经启动并正在运行。

我通过tomcat context.xml将Web应用程序与数据库连接起来

 <Parameter name="abc.connection.url" value="jdbc:postgresql://1.2.3.4:5432/dbname" /> 

其中1.2.3.4是容器正在运行的docker主机ip。但是当我运行tomcat容器时,出现以下错误:

 org.postgresql.util.PSQLException: The connection attempt failed. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:225) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:136) ............... Caused by: java.net.NoRouteToHostException: No route to host at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 

任何帮助赞赏。

TL; DR :检查主机上的防火墙

您需要在您的postgres容器上公开的postgres端口上连接到主机的IP地址,而不是连接到Docker容器的IP地址。

例如,

 <Parameter name="abc.connection.url" value="jdbc:postgresql://192.168.xx:5432/dbname" /> 

您还需要在您的postgres docker容器中configurationpostgres以侦听来自127.0.0.1以外的默认连接。

例如,在pg_hba.conf

 host all all 0.0.0.0/0 md5 

这告诉postgres接受来自任何IP地址的传入连接(你可能想要把它locking到192.168.0.0/16这样的东西。

您还需要更改postgres.conflisten_addresses的值:

 listen_addresses = '*' # what IP address(es) to listen on; 

一旦你做了这些configuration更改,你可以检查,看看postgres是否正在收听docker容器内的所有IP的所有请求:

 netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 816/postgres tcp6 0 0 :::5432 :::* LISTEN 816/postgres 

然后从你的主机,确保你可以telnet到端口5432:

 telnet 192.168.xx 5432 Trying 192.168.xx.. Connected to 192.168.xx Escape character is '^]'. 

正如Chris McKinnel指出的那样,将端口转发到主机并不是这样的。 我想给你第二个解决scheme作为他的替代:链接。

https://docs.docker.com/userguide/dockerlinks/

所以你可以做这样的事情:

docker run -d -P –name tomcat –link postgres:postgres apache / tomcat apachectl start

…假设你的PostgreSQL容器被命名为“postgres”,将允许你直接从Tomcat容器连接。

请注意,这只适用于两个容器在同一台机器上,但听起来像是这样。