Docker部署SpringBoot+Hibernate应用连接PostgreSQL容器失败问题
SpringBoot + Hibernate + PostgreSQL 的Docker部署配置
我来帮你把这套基于Docker的SpringBoot应用部署配置整理得更清晰,方便后续维护和使用:
部署场景说明
当前采用两个Docker容器的架构:
- 一个基于自定义Tomcat镜像运行SpringBoot打包的
.war包 - 一个官方PostgreSQL镜像作为数据库服务
通过docker-compose来统一编排和管理这两个容器。
Docker Compose 完整配置文件
version: '3' services: spring2: build: context: . dockerfile: DockerfileTomcat ports: - 8080:8080 depends_on: - db networks: - datalink db: image: postgres ports: - 5432:5432 env_file: - psql.env volumes: - database:/var/lib/postgresql/data networks: - datalink networks: datalink: driver: bridge volumes: database: driver: local
关键配置细节解析
Tomcat服务(spring2):
- 基于当前目录下的
DockerfileTomcat构建自定义镜像,你可以在这个Dockerfile里配置Tomcat环境、复制war包等操作 - 端口映射
8080:8080,让你可以通过主机的8080端口访问SpringBoot应用 depends_on: db确保数据库容器先于Tomcat容器启动,但注意它不会等待数据库服务完全就绪- 加入
datalink自定义网络,和数据库容器处于同一网络,保证两者可以通过服务名(db)互相访问
- 基于当前目录下的
PostgreSQL服务(db):
- 使用官方postgres镜像,无需自己构建数据库镜像
- 端口映射
5432:5432,方便你用本地数据库工具直接连接容器内的PostgreSQL - 通过
psql.env环境文件传递数据库配置,比如你可以在这个文件里定义POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB等环境变量,避免敏感信息硬编码在docker-compose文件里 - 挂载named volume
database到容器的/var/lib/postgresql/data目录,实现数据库数据的持久化,即使删除容器,数据也会保留在主机上 - 加入
datalink网络,和Tomcat容器互通,SpringBoot应用里的数据库连接地址可以直接写jdbc:postgresql://db:5432/你的数据库名
小提示:如果你的SpringBoot应用启动时需要数据库完全可用,仅靠
depends_on可能不够,建议在应用代码里添加数据库连接重试逻辑,或者在docker-compose的db服务里配置healthcheck,让Tomcat容器等待数据库健康检查通过后再启动。
内容的提问来源于stack exchange,提问作者WilsonPena
相关产品推荐
相关产品推荐

