查找容器IP

既然你的应用和数据库都是部署在 Docker 上的,那么之前使用的 localhost 或 mysqld 命令就完全失效了。在 Docker 环境中,网络架构和宿主机是隔离的,这也是导致你连接超时(Connection is not available, request timed out after 30000ms)的根本原因。

以下是针对 Docker 环境的精准排查和解决步骤:

1. 检查数据库容器是否正常运行

首先,你需要确认数据库的 Docker 容器是否真的在运行。在服务器上执行:

复制代码
docker ps -a | grep mysql
  • 如果状态(STATUS)是 Up,说明容器在运行。
  • 如果状态是 Exited 或不断重启(Restarting),说明数据库挂了。请使用 docker logs <容器ID> 查看报错日志。

2. 修改数据库连接 IP(最关键的一步)

在 Docker 中,你的 Java 应用容器内的 localhost 指的是它自己 ,而不是宿主机的数据库容器。你需要将连接地址改为数据库容器的 IP 或 Docker 网络别名。

如何获取正确的 IP?

  1. 找到数据库容器的 ID 或名称:docker ps
  2. 获取其内部 IP:docker inspect <容器ID或名称> | grep IPAddress
  3. 将 application.properties 中的 URL 修改为:
    jdbc:mysql://<获取到的IP>:3306/newbee_mall_db?...

(注:如果你使用了 Docker Compose 编排,可以直接使用数据库的服务名,例如 jdbc:mysql://db:3306/...)

3. 排查容器内的资源竞争与启动顺序

在 Docker 环境中,容器之间的资源竞争可能导致性能问题。如果你的应用启动速度比数据库快,应用会在数据库完全初始化前尝试连接,从而导致连接超时。

解决方案:

  • 依赖管理 :确保应用启动依赖于数据库容器完全运行。如果使用 Docker Compose,请配置 depends_on 及健康检查(healthcheck)。

  • 重试机制 :在应用中实现重试机制,或在 HikariCP 中配置初始化允许失败并慢慢重试:

    复制代码
    # 初始化时允许失败,慢慢重试
    spring.datasource.hikari.initialization-fail-timeout=-1
    spring.datasource.hikari.connection-timeout=30000

4. 检查 Docker 资源限制

如果数据库服务器或应用程序容器资源不足(CPU、内存),可能会出现连接超时。

  • 使用 docker stats 命令监控容器内的 CPU 和内存使用情况,识别是否存在资源瓶颈。
  • 确保为数据库容器分配了足够的内存(MySQL 建议至少 512M 以上)。

💡 快速验证建议:

你可以直接进入你的 Java 应用容器内部,尝试连接数据库,以隔离网络问题:

复制代码
# 进入应用容器
docker exec -it <你的java应用容器ID> /bin/bash

# 在容器内尝试 ping 数据库 IP 或 telnet 3306 端口
ping <数据库容器IP>

如果 ping 不通或连不上,说明是 Docker 网络配置问题;如果能通,请仔细检查数据库的账号密码及 newbee_mall_db 库是否已在该容器中创建。

相关推荐
Decay__18 分钟前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Thanks_ks33 分钟前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
Decay__9 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
Decay__21 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
freejackman21 小时前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
codigger1 天前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
挖掘狂人1 天前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
Thanks_ks1 天前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
freejackman2 天前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
骑着蜗牛撵大象3273 天前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划