Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误

Posted

技术标签:

【中文标题】Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误【英文标题】:Docker: Springboot container can not connect to PostgreSql Container Connection error 【发布时间】:2019-04-25 00:37:04 【问题描述】:

我正在构建我的第一个 Springboot 2.0 应用程序。我正在尝试将我的 Springboot 应用程序放入一个 docker 容器中,并将我的 PostgresDB 放入另一个容器中。

我的 Dockerfile

    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD springboot-api-demo-0.1*.jar app.jar
    RUN sh -c 'touch /app.jar'
    EXPOSE 9443
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/urandom -jar /app.jar" ]

我的 docker-compose.yml 文件

version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"

我在 application.properties

中使用带有以下配置数据的 Springboot JPA Data 2.0
spring.datasource.url= jdbc:postgresql://localhost:54321/java_learning
spring.datasource.username=postgres
spring.datasource.password=postgres

我可以测试这两个图像都已启动。同样从 docker log 和 docker events,我看到 postgres Container 运行良好,即使我可以访问它并且也创建了一个 DB。 但是springboot容器启动但我死了,因为它无法连接到postgress并在下面抛出错误。

无法从数据库获取连接:连接尝试 失败

请注意,我的主机已经在端口 5432 上安装了 Postgres,这就是为什么我在我的 postgres 容器上进行 54321:5432 端口映射的原因。这是证明:) -

➜  springboot-api-demo git:(master) ✗ lsof -i:54321              
COMMAND     PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 44345 shailendra.singh   18u  IPv4 0xf62897fbdd69e31d      0t0  TCP *:54321 (LISTEN)
com.docke 44345 shailendra.singh   21u  IPv6 0xf62897fbdd119975      0t0  TCP localhost:54321 (LISTEN)

➜  springboot-api-demo git:(master) ✗ lsof -i:5432 
COMMAND  PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 715 shailendra.singh    5u  IPv6 0xf62897fbb43e03b5      0t0  TCP localhost:postgresql (LISTEN)
postgres 715 shailendra.singh    6u  IPv4 0xf62897fbbaeea9bd      0t0  TCP localhost:postgresql (LISTEN)

我不确定是什么问题。但是我的 Springboot 应用程序无法连接我的 postgres 容器,该容器运行良好,具有适当的凭据。

【问题讨论】:

【参考方案1】:

尝试:

spring.datasource.url= jdbc:postgresql://pgdb:5432/java_learning

postgres 数据库没有在 localhost 上运行,它在另一个具有另一个 IP(但未知)的容器中运行。

谢天谢地,docker-compose 会自动创建一个在 docker-compose.yml 中的所有容器之间共享的网络(除非明确说明不这样做),因此您可以神奇地使用 服务名称作为主机名。

另外,你的端口有错别字,Postgres 默认使用5432,而不是54321

【讨论】:

否 它不工作。我尝试使用主机作为 pgdb。它显示错误消息:与 pgdb:54321 的连接被拒绝。检查主机名和端口是否正确,以及 postmaster 是否接受 TCP/IP 连接。 糟糕,我错过了另一个错误,端口实际上是5432 而不是54321。我已经编辑了我的答案 除了@AnthonyRaymond 的回答之外,您实际上不需要公开数据库端口即可从springboot-api-demo 服务进行连接,因为这些服务无论如何都会通过内部网络进行通信。只有当您从另一台机器远程连接到 db 端口时,您才需要公开它。【参考方案2】:

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

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

您应该使用以下datasource 网址:

spring.datasource.url=jdbc:postgresql://pgdb:5432/java_learning

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

【讨论】:

不,它也不起作用。我尝试使用主机作为 pgdb。它显示错误消息:与 pgdb:54321 的连接被拒绝。检查主机名和端口是否正确以及 postmaster 是否接受 TCP/IP 连接。 —— 尝试使用 5432 而不是 54321【参考方案3】:

您的docker-compose.yml 规范中缺少网络配置。通过使用“网络”,您可以通过容器的服务名称(使用 dns,服务名称作为主机名)在容器之间有效地进行通信。

这是更新后的docker-compose.yml

version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
    networks:
      - mynet

  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"
    networks:
    - mynet

networks:
  mynet:
    driver: bridge

您的数据库 url 应类似于 spring.datasource.url=jdbc:postgresql://postgres:5432/java_learning(注意主机名 postgres 与服务名称相同。

【讨论】:

另外,我强烈建议将 docker-compose 升级到 >3.x

以上是关于Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误的主要内容,如果未能解决你的问题,请参考以下文章

Springboot 应用程序无法使用 docker-compose 连接到 MongoDB 容器

Spring boot JDBC无法连接到docker容器中的mysql

无法从 docker 容器内的 Spring Boot 连接到 Redis

无法从 Docker 容器连接到外部 SQL Server

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL

Docker 中的 Postgres 服务器无法连接到 Spring Boot 应用程序