You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SpringBoot Docker容器连接本地PostgreSQL数据库报错求助

解决Docker容器中SpringBoot应用连接本地PostgreSQL的问题

你遇到的核心问题是容器内的SpringBoot应用无法访问宿主机上的PostgreSQL数据库——因为容器里的localhost指向的是容器自身,而非你的物理主机。下面是几种针对性的解决方案:

方案1:使用宿主机实际IP(全平台通用)

  1. 先找到你的宿主机IP地址:
    • Linux/macOS:执行ifconfigip addr,找到对应网络接口的IP(比如eth0en0下的inet字段)
    • Windows:执行ipconfig,找到本地连接的IPv4地址
  2. 修改SpringBoot的激活配置文件(比如application-local.properties):
    spring.datasource.url=jdbc:postgresql://<你的宿主机IP>:5432/你的数据库名
    spring.datasource.username=数据库用户名
    spring.datasource.password=数据库密码
    
  3. 重新构建镜像并运行容器:
    docker run -p 8080:8080 risk-assesment:v1
    

方案2:使用Docker Host网络模式(仅Linux)

这种方式让容器直接复用宿主机的网络栈,容器内的localhost就等同于宿主机的localhost

docker run --net=host risk-assesment:v1

注意:此模式不需要再指定-p 8080:8080端口映射,容器会直接使用宿主机的8080端口,请确保该端口未被其他进程占用。

方案3:使用Docker Desktop内置DNS名称(仅Mac/Windows)

如果你用的是Docker Desktop for Mac或Windows,可以直接用host.docker.internal这个内置DNS名称访问宿主机:
修改配置文件的数据库URL:

spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/你的数据库名

重新构建运行容器即可。

必做的额外配置

不管用哪种方案,都要确保PostgreSQL允许外部连接:

  1. 打开postgresql.conf文件,修改监听地址:
    listen_addresses = '*'
    
  2. 打开pg_hba.conf文件,添加允许容器网段连接的规则(容器默认子网一般是172.17.0.0/16):
    host    all             all             172.17.0.0/16            md5
    
  3. 重启PostgreSQL服务使配置生效。

附你提供的应用日志:

2018-03-22 20:29:34.105 INFO 7 --- [ main] c.c.h.r.RiskAssessmentApplication : 以下配置文件处于激活状态:local
2018-03-22 20:29:34.180 INFO 7 --- [ main] ConfigServletWebServerApplicationContext : 正在刷新org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2ac1fdc4:启动日期[Thu Mar 22 20:29:34 CDT 2018];上下文层次结构的根
2018-03-22 20:29:36.568 INFO 7 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : 发现JSR-330 'javax.inject.Inject'注解并支持自动装配
2018-03-22 20:29:36.838 INFO 7 --- [ main] trationDelegate$BeanPostProcessorChecker : 类型为[org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$af64b9d0]的Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration'不符合所有BeanPostProcessors的处理条件(例如:不符合自动代理条件)
2018-03-22 20:29:37.516 INFO 7 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat已初始化端口:9000(http)
2018-03-22 20:29:37.570 INFO 7 --- [ main] o.apache.catalina.core.StandardService : 正在启动服务[Tomcat]
2018-03-22 20:29:37.571 INFO 7 --- [ main]...

内容的提问来源于stack exchange,提问作者Siraj Syed

火山引擎 最新活动