【问题标题】:Spring Boot, PostgreSQL, and Docker - Connection Refused whil Running in ContainerSpring Boot、PostgreSQL 和 Docker - 在容器中运行时连接被拒绝
【发布时间】:2018-06-29 19:24:25
【问题描述】:

我正在尝试构建一个由 Spring Boot 应用程序和 PostgreSQL 数据库组成的“服务”。当 Spring Boot 应用程序在我的本地计算机上运行时,我已经能够从 Spring Boot 应用程序访问数据库(在容器中运行)。现在,当我尝试将 Spring Boot 应用程序移动到容器时,我收到以下错误:

inventory_1  | 2018-01-20 18:43:06.108 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
inventory_1  |
inventory_1  | java.net.ConnectException: Connection refused (Connection refused)

但是,我可以从本地计算机连接到数据库: psql -h localhost -p 5000 -U kelly_psql -d leisurely_diversion

我的 application.properties 文件:

spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://localhost:5432/leisurely_diversion
spring.datasource.username=kelly_psql
spring.datasource.password=pass
spring.datasource.driver-class-name=org.postgresql.Driver

我的 docker-compose 文件:

    # Use postgres/example user/password credentials
version: '3.2'

services:
  db:
    image: postgres
    ports:
      - 5000:5432
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - type: volume
        source: psql_data
        target: /var/lib/postgresql/data
    networks: 
      - app
    restart: always
  inventory:
    image: kellymarchewa/inventory_api
    depends_on:
        - db
    ports:
      - 8080:8080
    networks:
      - app
    restart: always
volumes:
  psql_data:
networks: 
  app:

我的 Dockerfile(来自Spring website

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

我怀疑问题在于(就我而言)对 Docker 或容器的误解,但我不确定。任何建议将不胜感激。

【问题讨论】:

    标签: spring postgresql docker spring-boot docker-compose


    【解决方案1】:

    您将应用程序指向localhost,但这不是在容器之间共享的。

    要访问另一个容器,您必须参考它的hostname

    就您而言,我了解您希望inventory 服务访问db 服务。所以你应该使用以下datasource url:

    spring.datasource.url=jdbc:postgresql://db:5432/leisurely_diversion
    

    请参阅有关使用 docker compose 从另一个容器连接到容器的简单教程:https://docs.docker.com/compose/gettingstarted/

    【讨论】:

      【解决方案2】:

      就像我的情况一样,如果您使用 Docker Toolbox for windows 8.1 那么您不能使用“localhost”,

      你必须使用 docker machine ip;

       host> docker-machine ip default
      
       192.168.99.100
      

      之后您的网址将如下所示;

       spring.datasource.url=jdbc:postgresql://192.168.99.100:5432/bankdb
      

      这将成功连接到 docker Postgres DB。

      干杯!!

      【讨论】:

        【解决方案3】:

        详细说明 ESala 给出的答案:

        我同意,这是一个网络问题,给定的解决方案可以正常工作,但您也可以使用 localhost(例如,如果您真的想要),通过在运行容器时切换到网络主机模式(参见 @987654321 @)。就像为 nginx 完成的 here 一样。

        我会说你大部分时间都不会想要这个,因为它会破坏你获得的沙盒。但是这个选项是存在的。

        【讨论】:

          猜你喜欢
          • 2021-09-20
          • 1970-01-01
          • 2021-06-24
          • 2018-02-07
          • 2020-01-19
          • 2019-06-06
          • 2015-12-10
          • 1970-01-01
          • 2020-02-29
          相关资源
          最近更新 更多