解决Seata容器连MySQL报Communications link failure:端口用错了!

错误内容Communications link failure :表明 Seata 容器无法与 MySQL 数据库建立连接,核心原因是网络不通或数据库地址/端口配置错误。结合 Docker 环境,具体排查步骤如下:

1. 检查 MySQL 连接地址和端口是否正确

错误日志中连接的 URL 是:
jdbc:mysql://mysql:3308/seata?rewriteBatchedStatements=true&serverTimezone=UTC
需确认两个关键信息:

  • 主机名 mysql 是否正确
    mysql 应该是 MySQL 容器的名称(或网络别名),仅当 Seata 容器与 MySQL 容器在同一 Docker 网络(如你配置的 hmall 网络)时,才能通过容器名访问。
    若 MySQL 容器不在 hmall 网络,需将主机名改为 MySQL 容器的实际 IP(如 192.168.214.xxx)。

  • 端口 3308 是否正确
    MySQL 容器的默认端口是 3306,若你映射了其他端口(如 -p 3308:3306),则 URL 中应使用容器内部端口 3306(而非主机映射的 3308)。
    例如:若 MySQL 启动命令是 docker run -p 3308:3306 --name mysql --network hmall ...,则 Seata 连接 URL 应改为:
    jdbc:mysql://mysql:3306/seata?rewriteBatchedStatements=true&serverTimezone=UTC

2. 确认 MySQL 容器与 Seata 容器在同一网络

Seata 容器通过 --network hmall 加入了 hmall 网络,需确保 MySQL 容器也在该网络中:

# 查看 hmall 网络中的所有容器
docker network inspect hmall | grep "Name"

若 MySQL 容器不在 hmall 网络中,需将其加入:

# 将已启动的 MySQL 容器连接到 hmall 网络
docker network connect hmall 你的MySQL容器名

或重启 MySQL 容器时指定网络:

docker run -d --name mysql --network hmall -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 mysql:8.0

3. 检查 MySQL 容器是否正常运行

# 查看 MySQL 容器状态
docker ps | grep mysql

# 若未运行,启动它
docker start 你的MySQL容器名

# 查看 MySQL 容器日志(是否有启动失败、端口被占用等错误)
docker logs -f 你的MySQL容器名

4. 验证 Seata 容器到 MySQL 的网络连通性

进入 Seata 容器,测试能否访问 MySQL 容器的地址和端口:

# 进入 Seata 容器
docker exec -it seata bash

# 测试能否 ping 通 MySQL 容器(用容器名或IP)
ping mysql  # 若用容器名;若用IP则替换为 MySQL 容器的IP(通过 docker inspect 查看)

# 测试端口是否可达(需安装 telnet,若容器内没有则先安装)
apt-get update && apt-get install telnet
telnet mysql 3306  # 注意端口是 MySQL 容器的内部端口(通常是3306)
  • ping 不通:网络隔离,确保两者在同一网络。
  • telnet 失败:端口错误或 MySQL 未监听该端口,检查 MySQL 配置。

5. 检查 MySQL 是否创建了 seata 数据库

Seata 连接的数据库是 seata(URL 中指定),需确保 MySQL 中已存在该库:

# 进入 MySQL 容器
docker exec -it 你的MySQL容器名 mysql -uroot -p密码

# 查看是否有 seata 数据库
show databases;

# 若不存在,创建它
create database seata;

6. 检查 MySQL 配置是否允许远程连接

MySQL 默认可能限制远程连接,需确保 root 用户允许从 Seata 容器所在网络访问:

-- 进入 MySQL 后执行(允许 root 从任何IP连接,生产环境需限制IP)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

总结

最可能的问题是 端口错误(用了3308而非3306)MySQL 容器不在 hmall 网络。按以下步骤修复:

  1. 将 Seata 配置中的数据库端口改为 3306(MySQL 容器内部端口)。
  2. 确保 MySQL 容器加入 hmall 网络。
  3. 验证网络连通性后,重启 Seata 容器:
    docker restart seata
    
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐