故障排查优先级排序
- 服务状态 → 2. 端口监听 → 3. 防火墙 → 4. 权限配置 → 5. 网络路由
(按此顺序可覆盖95%的常见问题15)
mysql镜像启动命令:
docker run -p 3306:3306 --restart=always --name mysqlv8 -e MYSQL_ROOT_PASSWORD=Cde12345 -d 172.16.156.128:80/wj_demo/mysql:v8
镜像启动以后在虚拟机上telnet ip+端口时可以访问通,但是在宿主机上不通
排查步骤:
1、重启镜像、重启docker
2、宿主机测试
# 宿主机执行
ping <虚拟机IP> # 确认网络层可达:ml-citation{ref="2,7" data="citationList"}
telnet <虚拟机IP> 3306 # 失败则说明端口未开放:ml-citation{ref="5" data="citationList"}
3、查看端口监听
netstat -tunlp | grep 3306 # 确认 MySQL 正在监听 0.0.0.0:3306:ml-citation{ref="5,7" data="citationList"}
4、调整防火墙规则
关闭虚拟机的防火墙或者映射对应端口
关闭宿主机的防火墙(因为我第一次安装可以使用,重启以后无法使用,宿主机防火墙一直开启状态,所以我的没关闭,一直保持打开状态)
5、配置 MySQL 远程访问权限
-- 虚拟机内登录 MySQL
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES; # 刷新权限:ml-citation{ref="6,7" data="citationList"}
6、修改绑定地址
我的就是这里出的问题,重启虚拟机以后没有了这个映射
sudo vi /etc/mysql/my.cnf # 添加或修改
[mysqld]
bind-address = 0.0.0.0 # 允许所有IP连接:ml-citation{ref="1,5" data="citationList"}
systemctl restart mysql # 重启生效:ml-citation{ref="7" data="citationList"}
7、排查配置文件冲突
检查 /etc/mysql/my.cnf 是否包含:
skip_networking # 禁用网络连接(必须注释):ml-citation{ref="5" data="citationList"}
skip_grant_tables # 可能导致端口监听异常(建议注释):ml-citation{ref="5" data="citationList"}
修改后重启服务:systemctl restart mysql
8、杀手锏(高级检查)
抓包分析网络流量
# 虚拟机内执行
tcpdump -i eth0 port 3306 # 观察宿主机请求是否到达:ml-citation{ref="5" data="citationList"}
路由表检查
route -n # 确认默认网关正确指向宿主机:ml-citation{ref="2,8" data="citationList"}