navicat
docker
MySQL
Linux
問(wèn)題提出
我在上課時(shí)老師提出了使用navicat操作MySQL,由于我的MySQL是在Windows環(huán)境下的一臺(tái)Linux虛擬機(jī)的docker上(Linux的版本是Ubuntu 18.04.1),而navicat在主機(jī)上,所以我嘗試在Windows上對(duì)MySQL進(jìn)行連接但是在連接過(guò)程中出現(xiàn)了一些問(wèn)題.
因?yàn)槭墙佑|Linux,docker,mysql沒(méi)有多長(zhǎng)時(shí)間,所以有些內(nèi)容可能缺乏專業(yè)性.
當(dāng)然markdown也是接觸沒(méi)多久所以排版上也存在一些問(wèn)題.
嘗試一(失敗)
以下是我的操作:
1.在terminal
進(jìn)入MySQL
docker satrt fyhz
docker exec -it fyhz bash
mysql -uroot -p
2.配置Mysql
select host,user from user;
grant all privileges on *.* to 'root'@'%'
使root用戶在任何地方都有權(quán)限訪問(wèn)到數(shù)據(jù)庫(kù)
flush privileges;
刷新權(quán)限
3.查看fyhz
容器的IP
docker inspect fyhz | grep IP
得到
"LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "IPAMConfig": null, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0,
得到IP地址后去navicat
嘗試連接
錯(cuò)誤:
2003 - Can't connect to MySQL server on 'IP
'(10061 "Unknown error")
隨后我懷疑是IP地址的問(wèn)題就去查看了虛擬機(jī)的IP
hostname -I
得到10.0.2.15
172.17.0.1
兩個(gè)結(jié)果然后我嘗試了以下10.0.2.15
發(fā)現(xiàn)結(jié)果相同
由于我對(duì)IP
了解的不多,所以在這里遇到了難題,我所知道的也只是上面的兩個(gè)地址均為虛擬機(jī)的默認(rèn)IP地址
隨后我又做了一下嘗試性操作
1.允許外部訪問(wèn)3306端口
sudo ufw allow 3306
反饋:Rule added
Rule added (v6)
嘗試連接還是連接失敗 ,錯(cuò)誤相同
2.關(guān)閉Linux的防火墻
sudo ufw disabled
反饋:Firewall stopped and disabled on system startup
嘗試連接還是連接失敗,錯(cuò)誤相同
兩天后又有新思路
嘗試二(失敿柙蕖)
1.確認(rèn)Windows與虛擬機(jī)上的Ubuntu可以相互連接
打開(kāi)cmd輸入ipconfig
得到虛擬機(jī)ip與本機(jī)ip
(在這之前作者已經(jīng)將virtualbox中的ip設(shè)為自動(dòng)獲取,以保證Linux和Windows在同一個(gè)網(wǎng)段)
在cmd下輸入ping 169.254.32.14
得到
正在 Ping 169.254.32.14 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 169.254.32.14 的回復(fù): 字節(jié)=32 時(shí)間<1ms TTL=128
來(lái)自 169.254.32.14 的回復(fù): 字節(jié)=32 時(shí)間<1ms TTL=128
來(lái)自 169.254.32.14 的回復(fù): 字節(jié)=32 時(shí)間<1ms TTL=128
來(lái)自 169.254.32.14 的回復(fù): 字節(jié)=32 時(shí)間<1ms TTL=128
169.254.32.14 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4穆桂,已接收 = 4,丟失 = 0 (0% 丟失)境氢,
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 0ms末誓,最長(zhǎng) = 0ms丸逸,平均 = 0ms
在bash中輸入ping 192.168.134.241
得到
PING 192.168.134.241 (192.168.134.241) 56(84) bytes of data.
64 bytes from 192.168.134.241: icmp_seq=1 ttl=127 time=0.906 ms
64 bytes from 192.168.134.241: icmp_seq=2 ttl=127 time=0.994 ms
64 bytes from 192.168.134.241: icmp_seq=3 ttl=127 time=0.985 ms
^C
--- 192.168.134.241 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.906/0.961/0.994/0.053 ms
ok現(xiàn)在Windows與Linux之間已經(jīng)可以相互連接
2.再次嘗試連接
輸入Linux IP或者docker內(nèi)容器IP仍然無(wú)法連接,錯(cuò)誤相同
嘗試三(失斀踉)
1.設(shè)置Linux主機(jī)ip為192.168.6.99
sudo ifconfig enp0s3 192.168.6.99 netmask 255.255.255.0 up
2.創(chuàng)建新容器
docker run -itd --name fyhz -p 192.168.6.99 :7777:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
將容器的3306端口映射到ip:192.168.6.99的7777端口
3.配置Mysql
select host,user from user;
grant all privileges on *.* to 'root'@'%';
使root用戶在任何地方都有權(quán)限訪問(wèn)到數(shù)據(jù)庫(kù)
flush privileges;
刷新權(quán)限
4.嘗試連接
連接失敗,反饋Network error:Connection refused
隨即關(guān)閉防火墻再次嘗試連接,錯(cuò)誤反饋相同.
嘗試四(成功)
繼嘗試三中的問(wèn)題進(jìn)行解決式,發(fā)現(xiàn)了新方法:雙網(wǎng)卡.
這就涉及到虛擬機(jī)各種網(wǎng)絡(luò)連接方式的特性了
僅主機(jī)(Host-Only)網(wǎng)絡(luò)與網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
前者簡(jiǎn)單的理解為僅用于虛擬機(jī)與宿主機(jī)之間的數(shù)據(jù)連接與傳輸
而后者我的理解是虛擬機(jī)自己虛擬出了一個(gè)宿主機(jī)網(wǎng)絡(luò)下的IP來(lái)進(jìn)行網(wǎng)絡(luò)連接
此時(shí)網(wǎng)絡(luò)部署已經(jīng)完成,然后就是對(duì)docker的部署
因?yàn)楸救薲ocker中的mysql創(chuàng)建時(shí),沒(méi)有映射端口至Linux系統(tǒng)上,導(dǎo)致無(wú)法連接(這可能也是前幾次嘗試中失敗的原因之一)
隨后我再次進(jìn)入docker重新創(chuàng)建了一個(gè)容器將容器的3306端口映射到了linux的7777端口上
sudo docker run --name=mysql -it -p 7777:3306 -e MYSQL_ROOT_PASSWORD=emc123123 -d mysql
端口可以設(shè)為任意沒(méi)有被占用的端口
隨后進(jìn)入mysql
select host,user from user;
grant all privileges on *.* to 'root'@'%';
使root用戶在任何地方都有權(quán)限訪問(wèn)到數(shù)據(jù)庫(kù)
flush privileges;
刷新權(quán)限
隨后在命令行中輸入ifconfig查看enp0s3的ip地址(我的是enp0s3,主要就是要找到虛擬機(jī)設(shè)置的主機(jī)模式ip)
隨后去navicat中輸入ip地址進(jìn)行連接,設(shè)置端口為7777,輸入密碼
成功!
這樣我就可以正常的上課學(xué)習(xí)啦!!!