使用 Postgres docker 实例运行 Spring Boot docker 实例

Posted

技术标签:

【中文标题】使用 Postgres docker 实例运行 Spring Boot docker 实例【英文标题】:Running Spring Boot docker instance with Postgres docker instance 【发布时间】: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 网桥上运行。 更多:Differences between user-defined bridges and the default bridge 我会将 Spring-boot 容器的详细信息放在 docker-compose.yaml 文件中,让 docker-compose 处理网络。当您docker-compose up / down 时,它会自动创建/删除一个自定义桥以方便您使用。在此处查看更多信息:Networking in Compose 另一种选择是您提出的建议,是的,您自己更“手动”地处理网络。 【参考方案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 应用程序将与您的数据库一起使用。

【讨论】:

以上是关于使用 Postgres docker 实例运行 Spring Boot docker 实例的主要内容,如果未能解决你的问题,请参考以下文章

连接被拒绝 postgres docker

Docker - 如何在postgres容器中运行psql命令?

docker postgres使用

如何在 Dockerized GraphQL + Postgres 设置中运行 Prisma 迁移?

向 localhost 数据库添加气流连接(在 docker 上运行的 postgres)

批量插入在 docker 容器中运行的 Postgres 数据库挂起