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

ESC上Docker部署项目连MySQL报Communications link failure排查

问题根因

核心报错java.net.ConnectException: Connection refused代表应用发起TCP连接时,目标IP的对应端口没有服务监听,结合Docker Compose部署场景,具体诱因有3个:

  • depends_on配置仅控制容器的启动顺序,不会等待容器内的服务完全就绪:MySQL容器启动后需要10~30秒完成数据初始化、端口监听流程,此时Java应用已经开始初始化Hikari连接池,直接连接3306端口会被拒绝。
  • MySQL服务缺少初始化配置:当前配置仅设置了root密码,没有自动创建JDBC URL中指定的wallpaper业务库,就算端口连通也会出现库不存在的连接错误;如果没有配置数据持久化,每次重启容器都会重新初始化MySQL,时序问题会反复出现。
  • 没有配置服务就绪校验:默认配置下应用只要等MySQL容器进程启动就会执行自身启动逻辑,完全不管MySQL是否真的能提供服务。
  • 额外避坑:JDBC地址中写的mysql:3306是Docker Compose内置DNS解析的正确服务地址,不要手动改成127.0.0.1、localhost或者服务器公网IP,改了会直接指向应用容器自身或者绕公网被防火墙拦截,100%连接失败。
修复步骤
  1. 修改docker-compose.yml中的MySQL服务配置,增加自动建库、数据持久化、健康检查逻辑:
mysql:
  image: mysql:5.7.27
  ports:
    - 3306:3306
  environment:
    - MYSQL_ROOT_PASSWORD=xxxxxx
    - MYSQL_DATABASE=wallpaper # 首次启动自动创建业务库,和JDBC配置对应
  volumes:
    - ./mysql/data:/var/lib/mysql # 持久化MySQL数据,避免重启丢数据、重复初始化
  healthcheck: # 定义健康检查规则,只有MySQL能正常响应才算服务就绪
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pxxxxxx"]
    interval: 5s
    timeout: 3s
    retries: 10
  1. 修改wallpaper应用服务的依赖规则,等待MySQL健康检查通过后再启动应用:
wallpaper:
  image: wallpaper:latest
  build: .
  ports:
    - 8080:8080
  depends_on:
    mysql:
      condition: service_healthy # MySQL健康检查通过才启动应用
    redis:
      condition: service_started
  1. 给Hikari连接池增加容错配置,修改application-pro.yml,避免偶发时序问题导致应用启动失败:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:3306/wallpaper?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: xxxxxx
    hikari:
      connection-timeout: 30000 # 连接超时时间30秒
      initialization-fail-timeout: 0 # 连接池初始化失败时持续重试,不直接崩溃
  servlet:
    multipart:
      max-file-size: 30MB  
      max-request-size: 100MB 

pagehelper:
  helper-dialect: mysql

shiro-redis:
  enable: true
  redis-manger:
    host: redis:6379
  1. 清理之前的异常容器和残留匿名卷,重新部署:
docker-compose down -v
docker-compose up -d --build
验证方式

启动后先查看MySQL日志,确认服务完全就绪:

docker-compose logs -f mysql

日志中出现[Note] mysqld: ready for connections.字样代表MySQL启动完成,再查看应用日志,没有Hikari初始化报错即为修复成功。

云服务器注意:不需要在ESC安全组开放3306端口给公网,容器内部通信不受安全组规则影响,开放公网3306反而会有被爆破的安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:01:17