Kar*_*ikJ 5 postgresql containers tomcat docker
我将在Tomcat上运行的Web应用程序容器化并使用命令启动容器,
docker run -d -p 8080:8080 tveuser/tve-repository:tve-services
Run Code Online (Sandbox Code Playgroud)
我还使用以下命令在同一主机上运行PostgreSQL容器:
docker run -d -p 80:80 -p 5432:5432 tveuser/tve-repository:tve-postgresql
Run Code Online (Sandbox Code Playgroud)
我通过使用phpPgAdmin验证PostgreSQL正在运行,但无法通过tomcat连接到它.'docker ps'也告诉我两个容器都已启动并运行.
我通过tomcat context.xml将Web应用程序与数据库连接,后者的条目类似于
<Parameter name="abc.connection.url" value="jdbc:postgresql://1.2.3.4:5432/dbname" />
Run Code Online (Sandbox Code Playgroud)
其中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)
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.
TL; DR:检查主机上的防火墙
您需要在postgres容器上为postgres公开的端口上连接到主机的IP地址,而不是Docker容器的IP地址.
例如,
<Parameter name="abc.connection.url" value="jdbc:postgresql://192.168.x.x:5432/dbname" />
Run Code Online (Sandbox Code Playgroud)
你还需要在postgres docker容器中配置postgres来监听来自其他地方的连接127.0.0.1,这是默认设置.
例如,在pg_hba.conf:
host all all 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)
这告诉postgres接受来自任何IP地址的传入连接(您可能希望将其锁定为类似的地址192.168.0.0/16.
您还需要更改listen_addressesin 的值postgres.conf:
listen_addresses = '*' # what IP address(es) to listen on;
Run Code Online (Sandbox Code Playgroud)
完成这些配置更改后,您可以检查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
Run Code Online (Sandbox Code Playgroud)
然后从您的主机,确保您可以telnet到端口5432:
telnet 192.168.x.x 5432
Trying 192.168.x.x...
Connected to 192.168.x.x.
Escape character is '^]'.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4378 次 |
| 最近记录: |