【问题标题】:Running Spring Boot docker instance with Postgres docker instance使用 Postgres docker 实例运行 Spring Boot docker 实例
【发布时间】:2020-12-21 15:30:36
【问题描述】:

我正在尝试运行一个连接 Postgres 数据库的 Spring Boot 应用程序:

docker-compose.yml(用于 Postgres):

  version: '3'
  services:
  postgres-db:
  container_name: postgres-db
  image: postgres:latest
  restart: always
  ports:
  - "5432:5432"
  environment:
  POSTGRES_USER: my_user
  POSTGRES_PASSWORD: my_password
  POSTGRES_DB: shorten-db

运行 Postgres 数据库:

docker-compose up

.Dockerfile(用于 Spring Boot 应用):

  FROM openjdk:12-jdk-alpine
  RUN addgroup -S spring && adduser -S spring -G spring
  USER spring:spring
  ARG JAR_FILE=target/*.jar
  COPY ${JAR_FILE} app.jar
  ENTRYPOINT ["java","-jar","/app.jar"]

为了使用 Docker 运行 Spring 应用程序,我使用:

  mvn package
  
  docker build -t url-shorten/url-shorten-docker .
  
  docker run -p 8080:8080 url-shorten/url-shorten-docker

但是在上面运行docker命令时我收到错误:

Caused by: 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.

在 Spring application.properties 中,我使用以下方式连接到数据库:

spring.datasource.url=jdbc:postgresql://localhost:5432/shorten-db

我认为这个错误是由于 Spring Boot 应用程序在与 DB 不同的容器中运行,因此它无法在 localhost 上找到 DB。是否有将 Spring Book docker 容器连接到 DB 容器的惯用方式。或者我是否可以访问我机器的 IP 地址并使用该地址连接到在 Docker 上运行的 Postgres DB?

【问题讨论】:

  • 如果你在同一个网络中运行一个容器,它可以通过它的容器名称来访问,例如postgres-db:5432
  • 只有在同一 user-defined 桥上运行容器时,您得到的答案(直接使用容器名称 postgres-db)才有效。按照您现在的操作方式,db 容器在您 docker-compose up 时自动创建的网桥上运行,而另一个(使用docker run ...)将在default 网桥上运行。
  • 我会将 Spring-boot 容器的详细信息放在 docker-compose.yaml 文件中,让 docker-compose 处理网络。当您docker-compose up / down 时,它会自动创建/删除一个自定义桥以方便您使用。在此处查看更多信息:Networking in Compose
  • 另一种选择是您提出的建议,是的,您自己更“手动”地处理网络。

标签: java spring postgresql spring-boot docker


【解决方案1】:

是的,在这种情况下你不能使用 localhost

spring.datasource.url=jdbc:postgresql://postgres-db:5432/shorten-db

【讨论】:

    【解决方案2】:

    在 Spring application.properties 中,尝试将 DB 配置更改为:

    spring.datasource.url=jdbc:postgresql://postgres-db:5432/shorten-db
    

    在容器网络中,您需要使用容器名称作为主机。

    【讨论】:

      【解决方案3】:

      您可以将数据库和应用程序容器添加到一个 Docker 网络,并将数据源 URL 中的 PostgreSQL 主机更改为 postgres-db。然后 Spring 应用程序将与您的数据库一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2020-02-09
        • 2018-10-10
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多