You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker化SpringBoot应用无法连接Docker MySQL容器求助

问题排查及解决办法

1. 先修复docker-compose.yml的语法错误

你的compose文件存在几处格式问题,这会直接导致容器配置失效:

  • mysqldb的restart:unless-stopped缺少空格,改为 restart: unless-stopped
  • app的restart:on-failure缺少空格,改为 restart: on-failure
  • app的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:20:42