1--說明:
在使用docker搭建web服務(wù)時(shí)我們會(huì)將web服務(wù)于數(shù)據(jù)庫服務(wù)分別放在不同的鏡像中,以此將數(shù)據(jù)庫與web服務(wù)解耦合。在本文中我為大家介紹docker中利用 --link通信方式使得web服務(wù)器與數(shù)據(jù)庫服務(wù)器之間建立連接。在我的實(shí)驗(yàn)環(huán)境中數(shù)據(jù)庫服務(wù)器上安裝了mysql和redis兩種數(shù)據(jù)庫。在服務(wù)器中用的Apache和PHP的開發(fā)環(huán)境并用nginx負(fù)責(zé)負(fù)載均衡。
2--數(shù)據(jù)庫服務(wù)器的搭建:
建議使用編譯的方式安裝mysql和redis。
其中mysql的安裝教程可以參考下面這篇文章:
需要注意文章底部關(guān)于初始化mysql賬號(hào)這部分否則web服務(wù)器連接數(shù)據(jù)庫時(shí)會(huì)帶來問題。
redis的編譯安裝參考下面這篇文章:
我的安裝環(huán)境是centos 6.7,在我的安裝環(huán)境中上面兩篇文章可以完美安裝。
到這里為止我們已經(jīng)解決了數(shù)據(jù)庫服務(wù)器的docker 鏡像制作。
注意事項(xiàng):
在編譯安裝mysql時(shí)需要將mysql解壓后的my*cnf文件拷貝到/etc/目錄下
通過find / -name my*cnf就行查找我們可以看到下圖
隨便選一個(gè)my*.cnf文件我選的時(shí) my-large.cnf執(zhí)行
cp /usr/local/src/mysql-5.5.10/support-files/my-large.cnf /etc/my.cnf ? ?即可
這時(shí)候我們?nèi)バ薷?etc/my.cnf 在[mysqld]添加下面一句
skip-name-resolve
添加這句的原因是避免web服務(wù)器端的mysql客戶端在連接數(shù)據(jù)庫的時(shí)候無法解析hostname錯(cuò)誤。
到現(xiàn)在為止我們已經(jīng)建立好了mysql和redis的基礎(chǔ)鏡像。
然后我們將這個(gè)鏡像進(jìn)行保存:
sudo docker ps查找鏡像然后sudo docker commit保存鏡像。這部分操作請(qǐng)讀者自行Google解決。
回到宿主機(jī)上后我們需要利用Dockerfile來建立我們最終的數(shù)據(jù)庫鏡像。之所以開始不用Dockerfile一步建立鏡像主要是我們采用編譯安裝mysql和redis可能會(huì)出錯(cuò)。
先mkdir一個(gè)目錄出來接著進(jìn)入目錄執(zhí)行 vi Dockerfile在文件中寫下一下內(nèi)容:
這里主要的是最后兩句,添加這兩句的原因是開放我們的mysql和redis服務(wù)端口使得其他主機(jī)能夠連接我們的數(shù)據(jù)庫服務(wù)。
接著sudo docker build文件建立鏡像。
到此為止我們數(shù)據(jù)庫鏡像已經(jīng)制作完成。
3--web服務(wù)器鏡像
在搭建web服務(wù)器時(shí)先安裝httpd通過
yum install -y?httpd即可
然后我們還需要安裝mysql客戶端通過
yum install -y mysql安裝mysql客戶端我們還需要安裝mysql-devel因?yàn)樵诤竺嫖覀冃枰惭bphp的mysql擴(kuò)展缺少這個(gè)庫會(huì)導(dǎo)致編譯不通過。
安裝完mysql客戶端后還需要安裝redis這里安裝redis是因?yàn)槲覀冊(cè)谠L問數(shù)據(jù)庫服務(wù)器redis時(shí)需要本地的redis-cli客戶端,redis的安裝教程上面貼了連接。
安裝nginx以及nginx做代理服務(wù)器可以參考我另外兩篇文章
最后我們要進(jìn)行php的安裝。下面鏈接可以完美的進(jìn)行php的編譯安裝
編譯安裝php我能告訴你的就是耐心了。
接下來我們需要安裝php的mysql擴(kuò)展和redis擴(kuò)展再貼兩篇文章:
需要注意的是在安裝擴(kuò)展時(shí)有時(shí)會(huì)提示我們安裝autoconf這時(shí)我們直接執(zhí)行
yum install -y autoconf?
這個(gè)問題Google的答案是缺少一個(gè)依賴庫的問題但是你要是yum那個(gè)依賴庫則會(huì)自動(dòng)給你安裝php然后悲劇的事情發(fā)生了yum安裝下的php會(huì)替代掉你本來安裝的php。而yum安裝下來的一般是5.3的版本。
接著我們安裝redis擴(kuò)展:
到此我們web服務(wù)器鏡像制作完成,docker commit這個(gè)容器即可
4--通過--link使得兩個(gè)容器間能夠通信
先啟動(dòng)數(shù)據(jù)庫鏡像
sudo docker run -i -t --name db -P databasemirrorid
sudo docker run -i -t --name web --link db:webdb -P webmirrorid
這時(shí)候我們就能夠在web服務(wù)器容器中操作mysql和redis了
通過redis-cli -h db直接連接數(shù)據(jù)庫服務(wù)器中的redis服務(wù)
通過mysql -h db -uroot -ppassword直接訪問數(shù)據(jù)庫服務(wù)器中的mysql服務(wù)。
5--我在安裝時(shí)需要的坑
(1)開始時(shí)我未用dockerfile來制作數(shù)據(jù)庫鏡像,直接選擇在運(yùn)行服務(wù)器鏡像的時(shí)候通過指定docker run --expose參數(shù)來開放端口,但是找了半天docker --expose貌似不能開放兩個(gè)及以上單獨(dú)的端口可以開放某一段端口例如 --expose n-m開放n到m這一段的端口,我要開放3306和6379端口的話就要--expose 3306-6379一旦加入這個(gè)參數(shù)基本就宣告主機(jī)將會(huì)卡死,通過sudo ps -aux|grep docker可以看到后臺(tái)啟動(dòng)了大量的docker進(jìn)程,具體可能跟docker的端口綁定有關(guān)。
(2)在搭建web服務(wù)器是PHP需要與mysql客戶端連接,這時(shí)需要要安裝mysql的擴(kuò)展,由于我們時(shí)yum安裝的mysql客戶端缺少mysql-devel依賴庫,導(dǎo)致編譯時(shí)一直報(bào)錯(cuò),然而報(bào)錯(cuò)也未能提示錯(cuò)誤是由于缺少這個(gè)庫,網(wǎng)上找不到靠譜的答案。