Docker化SpringBoot应用无法连接Docker MySQL容器求助
问题排查及解决办法
1. 先修复docker-compose.yml的语法错误
你的compose文件存在几处格式问题,这会直接导致容器配置失效:
mysqldb的restart:unless-stopped缺少空格,改为restart: unless-stoppedapp的restart:on-failure缺少空格,改为restart: on-failureapp的env_file缩进错误,它应该和build、restart同级,不能嵌套在restart节点下
修正后的完整配置:
version: "3.8" services: mysqldb: image: mysql:5.7 restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=baskartest ports: - 3307:3306 volumes: - db:/var/lib/mysql app: depends_on: - mysqldb build: ./bezkoder-app restart: on-failure env_file: ./.env ports: - 8084:8080 environment: SPRING_APPLICATION_JSON: '{ "spring.datasource.url" : "jdbc:mysql://mysqldb:3306/baskartest?useSSL=false&allowPublicKeyRetrieval=true", "spring.datasource.username" : "root", "spring.datasource.password" : "root", "spring.jpa.properties.hibernate.dialect" : "org.hibernate.dialect.MySQL5InnoDBDialect", "spring.jpa.hibernate.ddl-auto" : "update" }' volumes: - .m2:/root/.m2 stdin_open: true tty: true volumes: db:
2. 调整JDBC连接参数
在JDBC URL中追加allowPublicKeyRetrieval=true,这是MySQL 5.7容器环境下常见的连接要求,可避免公钥检索失败导致的链路中断。
3. 处理MySQL就绪延迟问题
depends_on仅保证容器启动顺序,不确保MySQL服务完全初始化完成。SpringBoot启动时可能MySQL还没准备好,导致连接失败:
- 可以在SpringBoot代码中添加数据库连接重试逻辑,比如配置Hikari连接池的
connection-test-query、max-retries等参数实现自动重试 - 或者修改应用的Dockerfile,引入
wait-for-it.sh工具,在启动应用前等待MySQL 3306端口就绪
4. 验证MySQL用户访问权限
进入MySQL容器,检查root用户的访问权限:
docker exec -it <你的mysqldb容器ID> mysql -uroot -proot
执行SQL查看权限:
SELECT host, user FROM mysql.user;
如果root用户的host是localhost,执行以下命令开放权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;
5. 检查容器网络连通性
进入SpringBoot应用容器,测试和MySQL服务的网络连通性:
# 进入应用容器 docker exec -it <你的app容器ID> ping mysqldb # 测试端口连通 docker exec -it <你的app容器ID> telnet mysqldb 3306
如果连通失败,在compose中显式定义网络:
# 在compose末尾添加 networks: app-net: driver: bridge # 在mysqldb和app服务中分别添加 networks: - app-net
内容的提问来源于stack exchange,提问作者baskar
相关产品推荐
相关产品推荐

