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

时间:2019-05-18 19:10:44

标签: postgresql spring-boot docker docker-compose

我的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   拒绝了检查主机名和端口是否正确,以及   邮政局长正在接受TCP / IP连接。 app_1

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

  

db_1 | 2019-05-18 19:05:53.692 UTC [1]日志:数据库系统为   准备接受连接

1 个答案:

答案 0 :(得分:3)

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

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

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