【问题标题】:Spring Docker container cannot access Postgres Docker containerSpring Docker 容器无法访问 Postgres Docker 容器
【发布时间】:2019-10-05 17:04:27
【问题描述】:

我的 spring-boot 应用程序的 Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/media-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

application.yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/media
    username: postgres
    password: postgres
    hikari:
      connectionTimeout: 30000

这里是docker-compose.yml

version: '3'
services:
  db:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: media
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

  app:
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      - db
    ports:
      - "8080:8080"

运行 docker-compose up --build 会导致:

app_1 | org.postgresql.util.PSQLException:连接到 0.0.0.0:5432 拒绝了。检查主机名和端口是否正确,以及 postmaster 正在接受 TCP/IP 连接。 app_1

我的猜测是 spring 应用程序在 postgres 准备好之前尝试连接到 postgres,但我得到以下日志:

db_1 | 2019-05-18 19:05:53.692 UTC [1] LOG:数据库系统是 准备好接受连接

【问题讨论】:

  • 我怀疑0.0.0.0 会起作用(而localhost 肯定不会起作用,因为数据库与您的应用程序不在同一个容器中)。在 Docker Compose 中,其他服务是通过虚拟 DNS 提供的,因此您应该可以使用 db
  • 所以,尝试通过jdbc:postgresql://db:5432/media 连接。
  • 按照您的建议将spring.datasource.url 更改为jdbc:postgresql://db:5432/media,使其工作。谢谢。随时将您的评论变成答案,以便我接受。

标签: postgresql spring-boot docker docker-compose


【解决方案1】:

Docker Compose 的主要目的是启动一组 Docker 容器,然后它们将作为独立的实体运行。默认情况下,所有容器都将与所有其他容器建立虚拟网络连接,但您可以根据需要进行更改;您将获得该功能,因为您尚未指定自定义配置。

每个容器都会在 Docker 设置的虚拟网络中获得一个虚拟 IP 地址。由于这些是动态的,Docker Compose 通过创建与每个服务对应的内部 DNS 条目使您更容易。因此,您将拥有两个容器,可以分别从它们自己或另一个容器中寻址为appdb。如果您安装了 ping,您也可以通过 docker-compose exec 或手动创建的 shell ping 这些名称。

因此,正如我们在 cmets 中发现的,您可以从 app 连接到 jdbc:postgresql://db:5432/media,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2018-08-09
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多