将Docker映像连接到本地Postgres

时间:2020-08-14 11:36:39

标签: java postgresql docker

我有一个连接到本地Postgres数据库的Spring应用程序。很好。

然后我从Spring应用程序创建了一个Docker映像。运行容器时,它将引发数据库连接错误。

我已遵循建议的here解决方案,但仍然遇到相同的错误。

[ERROR ] [task-1] c.z.h.p.HikariPool c.z.h.p.HikariPool.throwPoolInitializationException(HikariPool.java:593) – HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:285)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:217)
    at org.postgresql.Driver.makeConnection(Driver.java:458)
    at org.postgresql.Driver.connect(Driver.java:260)

我已经以几种方式运行docker映像,结果相同。

docker run app-image

docker run --network=host app-image

Dockerfile:

FROM java:8-jdk-alpine

COPY ./build/libs/runtime-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app

ENTRYPOINT ["java", "-jar", "runtime-0.0.1-SNAPSHOT.jar"]
# Expose standard tomcat port

EXPOSE 9888

postgresql.conf:

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'

pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD

host        postgres        postgres     0.0.0.0/0              trust
host        postgres        postgres     172.17.0.0/16          trust

1 个答案:

答案 0 :(得分:1)

spring应用程序尝试连接到localhost:5432。由于主机和每个容器都是独立的网络实体(即主机和每个容器在docker内部网络中都有自己的网络地址),因此容器尝试连接到在其上运行的数据库。由于没有数据库在运行,因此无法建立连接。

要解决此问题,您需要获取docker内部网络内主机的IP地址(例如,参见this article at devilbox),并将该地址用作spring应用程序的数据库服务器。


我建议同时在docker容器中运行postgres。例如,您可以使用the official postgres image from dockerhub。然后,您可以在spring容器中以postgres容器的名称引用postgres容器。