最近,喵哥在學習數據庫,遇到一個很棘手的問題,具體描述如下。
可以在黑底白字的界面熟練操作數據庫的確很酷,但是實際應用數據庫肯定不是爲了耍酷,怎麼把數據庫運用到程序中去纔是真理。所以,喵哥就投入到怎麼在Windows10上調用docker中centos系統裏面MySQL的數據庫的工作中。然而,事情遠沒有想象中那麼簡單,安裝好MySQL之後,一直連不上centos裏的數據庫。後來,去找視頻學習了一下,發現需要用網絡橋接的辦法來實現宿主與docker中容器的通信,但是由於視頻的教程說得不是太清楚,而且都是在Linux環境中,與Windows有些出入,在設置docker容器的網絡連接時出了些狀況,導致沒有實現在Windows下連接docker中centos裏的MySQL數據庫。暫時先放到一邊。觀看教程視頻也不是沒有收穫,至少知道了來宿主連接docker容器需要橋接,至於爲什麼,怎麼橋接,還得去研讀計算機網絡。
經過幾天時間的學習,發現docker中容器用的IP地址都是專用IP地址,比如我用的centos的IP地址是:172.17.0.2。專用IP地址是一些用於機構內部通信的地址,一共有三個分塊:
起點地址 | 終點地址 | 或可記爲 | 又稱爲 | |
1 | 10.0.0.0 | 10.255.255.255 | 10.0.0.0/8 | 24位塊 |
2 | 172.16.0.0 | 172.31.255.255 | 172.16.0.0/12 | 20位塊 |
3 | 192.168.0.0 | 192.168.255.255 | 192.168.0.0/16 | 16位塊 |
專用IP地址要與互聯網通信需要用到網絡地址轉換NAT(Network Address Translation),這就使得專用IP地址的主機可以與互聯網通信,這種通信過程中,專用網絡內部的主機是主導機器(通信必須由它發起),所以這種方法實現的通信主機是不能用來當作服務器的。也就無法解決喵哥遇到的問題。
另外一種解決方案是利用橋接的方法,好在發現docker的默認網絡配置方法是橋接(bridge模式),這也驗證了我之前看過的教程,所以離最終的目標已經很接近了。但是喵哥目前對於在windows下橋接docker容器不是太懂,對於docker的地址設置及docker容器地址的分配也毫無頭緒,這些作爲下一個學習的目標,等喵哥有了進一步的想法會立即更新到博客。
雖然無法在Windows下實現訪問docker中centos裏的MySQL,但是學習怎麼編程使用MySQL還是必要的,所以喵哥換了個思路,在docker中建兩個centos容器,這樣就可以保證他們處於一個專用網段。比如,172.17.0.2和172.17.0.3。兩個系統可以互相通信是互相使用MySQL的基礎,但不是充分的。要讓其他系統訪問自己的數據庫,需要給其他數據庫授權。
mysql> grant all PRIVILEGES on db_name.* to 'username'@'xxx.xxx.xx.x' identified by 'password' WITH GRANT OPTION;
#說明#
/*
數據庫的授權用grant:
grant 權限 on 數據庫.表 to 用戶 【identified by '密碼'】 with grant option;
其中,
權限有:select、insert、update、delete和all privileges。
數據庫爲本地存在的數據庫名,表爲數據庫中的表,如果要全選某個項目,可用*代替,如
*.*表示所有數據庫的表,exp_country.*表示exp_country中的所有表,max_sal.k1表示max_sal中的k1表。
用戶,可以在本地自建。也可以是遠程的,用'username'@'IP地址'表示。
密碼爲可選項。
附帶的with grant option可以使得被授權用戶也有賦予其他用戶權限的權力
數據庫收回權限用revoke:
revoke 權限 【on 數據庫.表】 option from 用戶;
*/
首先,在172.17.0.2主機設置172.17.0.3的訪問權限:
然後,在172.17.0.3主機上就可以登入172.17.0.2上的MySQL,我授權的是使用exp_country這個數據庫。
在172.17.0.2查看數據庫:
在172.17.0.3查看數據庫:
可見172.17.0.3已經可以使用172.17.0.2下的exp_country數據庫了。
附表:MySQL的數據庫權限
權 限 |
說明 |
---|---|
ALL | 除GRANT OPTION外的所有權限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPORARY TABLE |
CREATE USER | 使用CREATE USER、 DROP USER、 RENAME USER和REVOKEALL PRIVILEGES |
CREATE VIEW | 使用CREATE VIEW |
DELETE | 使用DELETE |
DROP | 使用DROP TABLE |
EXECUTE | 使用CALL和存儲過程 |
FILE | 使用SELECT INTO OUTFILE和LOAD DATA INFILE |
GRANT OPTION | 使用GRANT和REVOKE |
INDEX | 使用CREATE INDEX和DROP INDEX |
INSERT | 使用INSERT |
LOCK TABLES | 使用LOCK TABLES |
PROCESS | 使用SHOW FULL PROCESSLIST |
RELOAD | 使用FLUSH |
REPLICATION CLIENT | 服務器位置的訪問 |
REPLICATION SLAVE | 由複製從屬使用 |
SELECT | 使用SELECT |
SHOW DATABASES | 使用SHOW DATABASES |
SHOW VIEW | SHOW CREATE VIEW |
SHUTDOWN | 使用mysqladmin shutdown(用來關閉MySQL) |
SUPER | 使用CHANGE MASTER、 KILL、 LOGS、 PURGE、 MASTER和SET GLOBAL。還允許mysqladmin調試登錄 |
UPDATE | 使用UPDATE |
USAGE | 無訪問權限 |