Docker部署SpringBoot应用时MySQL通信链接失败求助
解决Docker部署Spring Boot应用的Communications link failure错误
你的配置里存在多个导致数据库连接失败的问题,逐个修复即可:
1. 数据库服务名、端口与库名错误
- Docker Compose内部服务之间通过服务名访问,你在
application.properties和docker-compose.yml里用的backend是无效主机名,要改成数据库服务名db。 - MySQL容器内部默认端口是
3306,你配置里写的3307是错误的,容器间通信不需要用宿主机映射端口,直接用容器自身的3306端口。 docker-compose.yml里的SPRING_DATASOURCE_URL写的库名是database,要改成你预设的proyectodiagrama。
修复后的application.properties数据库配置:
#database spring.datasource.url=jdbc:mysql://db:3306/proyectodiagrama?autoReconnect=true&useSSL=false spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=root # 和docker-compose里的MYSQL_ROOT_PASSWORD保持一致
修复后的docker-compose.yml环境变量:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/proyectodiagrama?autoReconnect=true&useSSL=false
2. 数据库密码不匹配
你在docker-compose.yml里设置了MYSQL_ROOT_PASSWORD: root,但application.properties里的数据库密码为空,必须改成root才能正常连接。
3. 确保数据库就绪后再启动Web服务
depends_on仅保证启动顺序,不保证MySQL完成初始化。给db服务添加健康检查,确保数据库就绪后再启动web:
修改docker-compose.yml的db服务:
db: image: mysql:5.7 volumes: - /opt/test:/var/lib/mysql - ./mysql-dump:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: proyectodiagrama MYSQL_USER: MYSQL_PASSWORD: ports: - 3306:3306 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 5s retries: 5
修改web服务的depends_on:
web: depends_on: db: condition: service_healthy # 其余配置保持不变
4. 统一启动方式
不要混用docker-compose up和docker run -p 8080:8080 mywebapp,后者启动的容器不在docker-compose的专属网络中,无法访问db服务。统一用docker-compose up启动整个服务栈。
5. 验证连接(可选)
修复后启动服务,如果仍有问题,可进入web容器内部,用ping db测试网络连通性,或用mysql -h db -u root -proot直接测试数据库连接。
内容的提问来源于stack exchange,提问作者Redox
相关产品推荐
相关产品推荐

