无Docker Compose时,如何连接Docker中的Spring Boot与PostgreSQL?
解决Docker容器中Spring Boot连接PostgreSQL被拒绝的问题
问题场景
学习Docker时搭建了一个支持用户增查改的Spring Boot小应用,PostgreSQL容器运行在5432端口,应用容器运行在8081端口,但启动后出现连接拒绝错误:
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
启动容器的命令:
docker run --name postgres --network demo-network -p 5432:5432 -e POSTGRES_PASSWORD=admin -d postgres docker run --network demo-network -p 8081:8081 -d myuser/demodocker
当前Spring Boot的application.properties配置:
server.port=8081 spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=admin spring.jpa.hibernate.ddl-auto=drop-and-create spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect javax.persistence.schema-generation.scripts.action=drop-and-create
解决步骤
1. 修改数据库连接URL
将application.properties里的数据库URL中的localhost替换为PostgreSQL容器的名称postgres——同一Docker网络内,Docker会自动通过容器名完成DNS解析:
spring.datasource.url=jdbc:postgresql://postgres:5432/postgres
2. 重新构建并启动Spring Boot容器
如果配置是打包在镜像内的,先重新构建镜像:
docker build -t myuser/demodocker .
然后重启容器:
docker stop myuser/demodocker docker rm myuser/demodocker docker run --network demo-network -p 8081:8081 -d myuser/demodocker
原理说明
Docker容器内部的localhost指向容器自身的网络栈,而非宿主机。由于两个容器已加入同一demo-network,直接使用PostgreSQL容器的名称即可访问服务,Docker内置DNS会把容器名解析为对应容器的IP地址。
内容的提问来源于stack exchange,提问作者stacktrace2234
相关产品推荐
相关产品推荐

