You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2上Docker Compose部署SpringBoot+Kafka+PostgreSQL时PostgreSQL连接失败

解决Docker Compose部署中SpringBoot连接PostgreSQL失败问题

问题描述

在EC2服务器上使用Docker Compose部署Zookeeper、Kafka、SpringBoot应用、PostgreSQL四个容器时,出现org.postgresql.util.PSQLException: The connection attempt failed错误。

配置文件

docker-compose.yml

version: "3.8"
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper_container
    networks:
      - my_network

  kafka:
    image: wurstmeister/kafka
    container_name: kafka_container
    hostname: kafka
    networks:
      - my_network
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://57.125.58.225:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

  springboot-app:
    build:
      context: .
      dockerfile: Dockerfile
    image: imageone
    container_name: imageone_container
    networks:
      - my_network
    ports:
      - "9000:9000"
    depends_on:
      - kafka
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/fasmho
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: postgres
      SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka:9093

  postgres:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: fasmho
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
networks:
  my_network:
    driver: bridge

application.properties

server.port=9000
spring.datasource.url=jdbc:postgresql://postgres:5432/fasmho
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

spring.kafka.bootstrap-servers=kafka:9093
spring.kafka.producer.bootstrap-servers=kafka:9093
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer

spring.kafka.consumer.bootstrap-servers=kafka:9093
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties.spring.json.trusted.packages=com.kaif.dockersringboot.entities

解决方案

1. 将PostgreSQL加入自定义网络

postgres服务未配置networks字段,默认使用Docker默认网络,与springboot-app所在的my_network网络隔离,导致无法通过服务名postgres通信。修改docker-compose.yml中postgres服务配置:

postgres:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: fasmho
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    networks:
      - my_network  # 加入自定义网络

2. 调整SpringBoot应用的依赖顺序

springboot-app启动依赖PostgreSQL服务,但当前depends_on仅包含kafka,需添加postgres确保容器启动顺序:

springboot-app:
    # 其他配置保持不变
    depends_on:
      - kafka
      - postgres  # 添加PostgreSQL依赖

注意:depends_on仅保证容器启动顺序,若PostgreSQL初始化较慢,需在SpringBoot应用中添加数据库连接重试逻辑,或使用等待脚本验证服务就绪后再启动应用。

3. 验证配置一致性

确认以下配置完全匹配:

  • docker-compose.yml中POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD与SpringBoot配置中的数据库名称、用户名、密码一致
  • JDBC URL使用容器内部服务名postgres和端口5432(无需使用宿主机IP或映射端口)

4. 重启服务验证

执行以下命令重启所有服务:

docker-compose down
docker-compose up --build

查看SpringBoot应用日志确认连接状态:

docker logs imageone_container

内容的提问来源于stack exchange,提问作者ASIF KAIF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:33:14