Docker - 同一主机中的Tomcat和PostgreSQL容器 - 无主机路由

时间:2014-07-31 22:15:53

标签: postgresql tomcat containers docker

我将在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

我通过使用phpPgAdmin验证了PostgreSQL正在运行但是无法通过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 host 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)

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:7)

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

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

,例如,

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

您还需要在postgres docker容器中配置postgres,以侦听来自127.0.0.1以外的其他位置的连接,这是默认设置。

,例如pg_hba.conf

host    all             all             0.0.0.0/0               md5

这告诉postgres接受来自任何IP地址的传入连接(您可能希望将其锁定为类似192.168.0.0/16的内容。

您还需要在listen_addresses中更改postgres.conf的值:

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

完成这些配置更改后,您可以检查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         

然后从您的主机,确保您可以远程登录到端口5432:

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

答案 1 :(得分:0)

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

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

所以你可以这样做:

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

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

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