故障排查優先級排序
- 服務狀態 → 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"}