前言
現在是2020年3月,在雲服務器的Docker搭建MySQL服務,遇到MySQL遠程連接1045錯誤,看了網上很多資料都沒有解決這個錯誤,發現是因爲新下載的MYSQL的登陸鑑權模式發生了變化。如果想看如何解決1045錯誤可以直接看文章最後部分。
一、建立鏡像
拉取官方鏡像(我們這裏選擇5.7,如果不寫後面的版本號則會自動拉取最新版)
docker pull mysql:5.7 # 拉取 mysql 5.7
docker pull mysql # 拉取最新版mysql鏡像
檢查是否拉取成功
sudo docker images
一般來說數據庫容器不需要建立目錄映射
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
–name:容器名,此處命名爲mysql
-e:配置信息,此處配置mysql的root用戶的登陸密碼
-p:端口映射,此處映射 主機3306端口 到 容器的3306端口
-d:源鏡像名,此處爲 mysql:5.7
如果要建立目錄映射
duso docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
-v:主機和容器的目錄映射關係,":"前爲主機目錄,之後爲容器目錄
檢查容器是否正確運行
docker container ls
二、連接mysql
進入docker本地連接mysql客戶端
sudo docker exec -it mysql bash
mysql -uroot -p123456
遠程連接mysql
host: 127.0.0.1
port: 3306
user: root
password: 123456
如果你的容器運行正常,但是無法訪問到MySQL,一般有以下幾個可能的原因:
- 防火牆阻攔
# 開放端口:
$ systemctl status firewalld
$ firewall-cmd --zone=public --add-port=3306/tcp -permanent
$ firewall-cmd --reload
# 關閉防火牆:
$ sudo systemctl stop firewalld
- 需要進入docker本地客戶端設置遠程訪問賬號
一般來說,root只允許本機訪問,要想做到遠程訪問root,就要授權:
$ sudo docker exec -it mysql bash
$ mysql -uroot -p123456
mysql> grant all privileges on *.* to root@"%" identified by 'root' with grant option;
其中%表示授權給所有網段。然後重啓mysql:
docker restart mysql
如果重啓後,遠程連接時出現了1045錯誤,可能是沒有成功設置。mysql使用mysql數據庫中的user表來管理權限,修改user表就可以修改權限(只有root賬號可以修改):
mysql> use mysql;
Database changed
mysql> select host,user,authentication_string from user;
+--------------+------+-------------------------------------------+
| host | user | authentication_string |
+--------------+------+-------------------------------------------+
| localhost | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| % | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)
需要注意的是,網上很多資料是用password來訪問密碼,但新安裝的mysql數據庫下已經沒有password這個字段了,password字段改成了authentication_string,因此查詢密碼是要用authentication_string。可以輸入查詢語句select host,user,authentication_string from user;
後看看是否成功設置名爲“%”的主機名,如果有就檢查下對應的密碼是否與名爲localhost的密碼一致,如果不一致,需要做如下修改:
mysql> update user set authentication_string="*A731AEBFB621E354CD41BAF207D884A609E81F5E" where host="%";
在看看密碼是否一致,若改爲一致,重啓mysql看看是否還有1045錯誤。我在執行上述操作後不再彈出1045錯誤,成功實現root遠程連接。
參考文章:
https://www.cnblogs.com/sablier/p/11605606.html
https://www.cnblogs.com/dereckbu/p/9646486.html