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
相关产品推荐
相关产品推荐

