Spring Docker容器无法访问Postgres Docker容器

5
我的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: Connection to 0.0.0.0:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. app_1

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

db_1 | 2019-05-18 19:05:53.692 UTC [1] LOG: database system is ready to accept connections


2
我怀疑 0.0.0.0 不会起作用(而且 localhost 肯定不行,因为数据库不在与您的应用程序相同的容器中)。在 Docker Compose 中,其他服务通过虚拟 DNS 可用,因此您应该能够使用 db - halfer
1
所以,请尝试通过 jdbc:postgresql://db:5432/media 进行连接。 - halfer
1
spring.datasource.url 更改为 jdbc:postgresql://db:5432/media,正如您建议的那样,使其工作。谢谢。请随意将您的评论转化为答案,以便我接受它。 - senjin.hajrulahovic
1个回答

10
Docker Compose 的主要目的是启动一组 Docker 容器,这些容器将作为独立实体运行。默认情况下,所有容器都将在虚拟网络中相互连接,但如果您希望更改,可以进行配置;由于您没有指定自定义配置,因此您将获得该功能。
Docker 会在设置的虚拟网络中为每个容器分配一个虚拟 IP 地址。由于这些地址是动态的,Docker Compose 通过为每个服务创建内部 DNS 条目来使其更加便捷。因此,您将有两个容器,分别称为 "app" 和 "db",它们可以从它们自己或另一个容器访问。如果已安装 ping,则也可以通过 docker-compose exec 或手动创建的 shell 来 ping 这些名称。
因此,正如我们在评论中发现的那样,您可以从 "app" 连接到 "jdbc:postgresql://db:5432/media",并且它应该可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接