navicat無法連接到CentOS中Docker容器內的Mysql;報錯10038;服務器端口訪問被拒絕。

問題:在服務器上用docker配值好MySQL8.0的容器後,本地navicat無法連接。

解決過程記錄,最後的解決方法是在安全組策略那裏進行配置。

先在CentOS上把容器運行起來:
  • 下載鏡像
docker pull mysql:8.0
  • 創建容器,設置端口映射3306-3306
docker run -di --name=mysql_a -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql
  • 進入容器啓動mysql
docker exec -it mysql_a /bin/bash
  • 登陸
mysql -uroot -p123456
  • 讓root可被所有ip鏈接,完了刷新限權
grant all privileges on *.* to root@'%' with grant option;  
flush privileges;
  • mysql8.0的版本和以前5的版本加密方式不一樣,之前被坑過一次導致navicat無法連接上。這裏先把這坑填了,將密碼修改並改爲之前的native加密方式。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • 上一步是讓遠程客戶端連接數據庫密碼被修改了,實際上內部還是原來的加密方式,同樣也修改一下,讓容器內部的登陸密碼也變成native加密方式。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY  '123456';
  • 檢查用戶信息是否修改成功:
use mysql ;  select user,host,authentication_string,plugin from user;

在這裏插入圖片描述

他表示改好了

  • 這個時候用本地navicat嘗試進行連接:

在這裏插入圖片描述
我果然不可能這麼順利…看的很多教程好像到這一步就完了,而且成功連接上了。。

  • 之後各種百度,說可能是CentOS防火牆請求給過濾了,於是嘗試關閉防火牆:
啓動防火牆:systemctl start firewalld
關閉防火牆:systemctl stop firewalld
檢查防火牆狀態:systemctl status firewalld 

結果檢查我的防火牆狀態:

在這裏插入圖片描述

這根本沒開的嘛。。

  • 於是又各種百度,有網友說可能是容器的映射端口失敗,centos根本沒有配分端口,或者分配錯誤。於是立馬下包檢查:
	1. 先安裝包命令包:
yum install net-tools
	2.檢查端口使用情況,只看tcp的:
netstat -nplt 

在這裏插入圖片描述
發現端口也是開啓的,沒毛病的嘛…

  • 這時候突然看到這個3306端口的進程使用的是IPv6協議,於是想到有沒有可能是我發送的ipv4協議請求無法被正確解析。

於是使用本地機器win10的命令【telnet ip 端口號】 對遠程服務器的3306端口進行測試:
這個需要win10本地設置開啓telnet服務,具體設置可以百度到。

telnet 47.94.239.23 3306

結果3306無法連通。
在這裏插入圖片描述
而我對ipv4的22端口測試發現是能夠連通的。

  • 於是猜想可能是服務器沒有正確設置ipv4轉爲ipv6。

於是又登陸服務器:

看看應用程序是否只能bind在ipv6上面:

sysctl net.ipv6.bindv6only

結果:
在這裏插入圖片描述
看看ipv4是否能夠轉發:

sysctl net.ipv4.ip_forward

結果:在這裏插入圖片描述
1 表示能轉發 ;0表示不能轉發

口區,結果又都是正常的。。

  • 最後,在一篇博客上看到,阿里雲的服務器還有一個叫安全組的東西。

這個東類似於防火牆,都是通過iptable組件來過濾ip。
於是打開我的阿里雲的控制檯,打開安全組策略。
在這裏插入圖片描述
發現裏面默認只有開放端口22,但沒有包含3306的端口範圍,突然也明白了之前telnet測試爲什麼只有22號端口能夠連通,3306無法連通。

於是手動添加一個入方向的安全組策略,端口範圍設置爲3306/3306,然後保存關網頁,用navicat測試:

在這裏插入圖片描述

終於成功連上了,簡直多舛。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章