使用Docker搭建MySQL服務,解決MySQL遠程連接1045錯誤

前言

現在是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,一般有以下幾個可能的原因:

  1. 防火牆阻攔
# 開放端口:
$ systemctl status firewalld
$ firewall-cmd  --zone=public --add-port=3306/tcp -permanent
$ firewall-cmd  --reload
# 關閉防火牆:
$ sudo systemctl stop firewalld
  1. 需要進入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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章