1、創(chuàng)建實(shí)例命令
docker run -id --name=c_mysql -p 3306:3306 -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.37
2、查看啟動(dòng)的實(shí)例 docker ps
3、這里映射的是宿主機(jī)的3306端口,我已經(jīng)把端口開放了
4、在宿主機(jī)進(jìn)行連接
#這個(gè)報(bào)錯(cuò)像是mysql不存在,查看mysql是否啟動(dòng)
#mysql已啟動(dòng),端口也沒有被占用
5、已經(jīng)在容器里面測試了,mysql可以正常連接;在試試將root用戶開放可以任何主機(jī)訪問
5.1、進(jìn)入容器,并連接mysql
docker exec -it c_mysql bash mysql -uroot -p123456
5.2、將root用戶開放所有主機(jī)可以訪問
mysql> grant all privileges on . to root@‘%'; #授權(quán) mysql> flush privileges; #刷新權(quán)限表
6、在宿主進(jìn)再次進(jìn)行連接測試
#還是不行!!!
7、去百度了一下,覺得是宿主機(jī)的路由沒有開啟,來試試看
#一圈回來,發(fā)現(xiàn)問題出在宿主機(jī),因?yàn)槿绻褂胢ysql命令,就是必須要/usr/bin/目錄下有這個(gè)命令。但是我是docker安裝mysql所以,宿主機(jī)不能使用mysql連接docker的數(shù)據(jù)庫,使用遠(yuǎn)程工具navicat連接時(shí)報(bào)的錯(cuò),應(yīng)該是root用戶沒有開啟,任何主機(jī)可以訪問的權(quán)限。由于上面已經(jīng)開了,我現(xiàn)在測試navicat是可以遠(yuǎn)程連接的
8、上面說到了一個(gè)宿主機(jī)路由的問題,我們路由沒開的話就會(huì)導(dǎo)致宿主機(jī)于容器實(shí)例網(wǎng)絡(luò)隔絕,所以是要打開的。
8.1、查看路由是否打開
sysctl net.ipv4.ip_forward
#返回值為1代表路由已開啟,為0就是未開啟
8.2、開啟路由
echo “net.ipv4.ip_forward = 1” >>/etc/sysctl.conf #將命令寫入到/etc/sysctl.conf文件中 sysctl -p #加載內(nèi)核 sysctl net.ipv4.ip_forward #再次查看路由是否開啟
補(bǔ)充:Docker里的Mysql無法連接,連接一段時(shí)間超時(shí)。ERROR 2013 (HY000): Lost connection to MySQL server at
嘗試使用命令行連接
mysql -h xxx.xxx.xxx.xxx -P 3306 -u root -p 123456
如果報(bào)錯(cuò):
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"
請重啟docker服務(wù)
然后再次啟動(dòng)容器
如果不是這種報(bào)錯(cuò),請檢查Mysql版本,如果為8.0及以上版本;需要注意,該版本密碼認(rèn)證機(jī)制已經(jīng)升級,有些客戶端未能兼容,請使用新的認(rèn)證方式修改Mysql密碼
還有就是,所登錄的用戶是否允許任意主機(jī)連接
use mysql; select user,host from user;
僅允許本地連接:root@localhost
允許任意連接:root@%
如果發(fā)現(xiàn)為:root@localhost
不要直接修改此表
可以新建一個(gè)用戶,并賦予權(quán)限
#Mysql8.0: #添加遠(yuǎn)程登錄用戶 CREATE USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'passwd!'; #賦予權(quán)限 GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
總結(jié)