最近想用docker整理一個linux開發(fā)環(huán)境超升,打包需要的軟件與配置绎签,在本機起一個docker容器來跑server與mysql進(jìn)行開發(fā)李破,部署時直接把dockerfile扔到機器上build一下即可硫眯。但在本機連接docker里的mysql時碰到了無法訪問的問題忘朝,開始以為是docker的問題,后來發(fā)現(xiàn)與docker無關(guān)泉坐,就是mysql遠(yuǎn)程連接的問題∥現(xiàn)象原因與解決方法如下:
- 在容器中mysql已啟動,可以在容器終端中進(jìn)入mysql命令行操作腕让。容器的3306端口映射到宿主機的3307端口孤钦。此時我想用宿主機上的db客戶端如mysqlworkbench連接容器中的mysql操作(這里為了方便用終端mysql-client來舉例子,實際報錯一樣)
$ mysql -uroot -h127.0.0.1 -P3307 // 向本地3307端口發(fā)起連接請求记某,3307對應(yīng)容器中的3306
發(fā)現(xiàn)報錯:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
- 檢查容器中的端口占用:
$ netstat -an | grep 3306
// 輸出
tcp6 0 0 127.0.0.1:3306 :::* LISTEN
監(jiān)聽端口正常司训,但卻綁定了本地地址,難怪總是連接不上液南。于是查了下資料壳猜,找到了解決辦法:修改mysql的配置文件(不同版本路徑可能不同,我的版本是5.7.25-0ubuntu0.18.04.2)滑凉,將bind-address后面增加遠(yuǎn)程訪問IP地址或者禁掉這句話统扳。
$ vi /etc/mysql/mysql.conf.d/mysqld.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
// 記得重啟哦
$ service mysql restart
- 再在宿主機上試一次,發(fā)現(xiàn)還是不行:
ERROR 1130 (HY000): Host '172.17.0.1' is not allowed to connect to this MySQL server
這里172.17.0.1
是宿主機在容器所處局域網(wǎng)中的ip地址畅姊。
在容器mysql中查詢:
mysql> USE mysql;
mysql> SELECT user, host FROM user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
也就是說咒钟,mysql默認(rèn)只允許root用戶在localhost上登錄。解決方法是為root用戶添加遠(yuǎn)程訪問的權(quán)限(或者新增其他用戶若未,把下面sql中的root改成新的用戶名就行了):
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你希望root遠(yuǎn)程訪問時輸入的密碼';
mysql> reflush privileges;
再查一次user表朱嘴,發(fā)現(xiàn)多了一個root@%
。這行是我們用來遠(yuǎn)程登錄的root賬戶粗合。注意萍嬉,root@localhost
的密碼可以與root@%
不同,遠(yuǎn)程登錄只能用我們剛才grant ... identified by ...
時輸入的密碼隙疚。
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
最后再試一次遠(yuǎn)程登錄壤追,成功了。
總的來說供屉,要遠(yuǎn)程連接mysql行冰,需要兩個步驟:
- 使mysql不止綁定localhost溺蕉;
- 在mysql中添加可以遠(yuǎn)程訪問的賬號并授權(quán)(這里用root舉例)。