docker搭建web服務(wù)器與數(shù)據(jù)庫服務(wù)器通信

1--說明:

在使用docker搭建web服務(wù)時我們會將web服務(wù)于數(shù)據(jù)庫服務(wù)分別放在不同的鏡像中,以此將數(shù)據(jù)庫與web服務(wù)解耦合。在本文中我為大家介紹docker中利用 --link通信方式使得web服務(wù)器與數(shù)據(jù)庫服務(wù)器之間建立連接。在我的實驗環(huán)境中數(shù)據(jù)庫服務(wù)器上安裝了mysql和redis兩種數(shù)據(jù)庫。在服務(wù)器中用的Apache和PHP的開發(fā)環(huán)境并用nginx負責(zé)負載均衡。


2--數(shù)據(jù)庫服務(wù)器的搭建:

建議使用編譯的方式安裝mysql和redis。

其中mysql的安裝教程可以參考下面這篇文章:

centos編譯安裝mysql

需要注意文章底部關(guān)于初始化mysql賬號這部分否則web服務(wù)器連接數(shù)據(jù)庫時會帶來問題。

redis的編譯安裝參考下面這篇文章:

編譯安裝redis

我的安裝環(huán)境是centos 6.7,在我的安裝環(huán)境中上面兩篇文章可以完美安裝。


內(nèi)核版本

到這里為止我們已經(jīng)解決了數(shù)據(jù)庫服務(wù)器的docker 鏡像制作。

注意事項:

在編譯安裝mysql時需要將mysql解壓后的my*cnf文件拷貝到/etc/目錄下

通過find / -name my*cnf就行查找我們可以看到下圖


find / -name my*cnf查找結(jié)果

隨便選一個my*.cnf文件我選的時 my-large.cnf執(zhí)行

cp /usr/local/src/mysql-5.5.10/support-files/my-large.cnf /etc/my.cnf ? ?即可

這時候我們?nèi)バ薷?etc/my.cnf 在[mysqld]添加下面一句

skip-name-resolve

添加這句的原因是避免web服務(wù)器端的mysql客戶端在連接數(shù)據(jù)庫的時候無法解析hostname錯誤。

到現(xiàn)在為止我們已經(jīng)建立好了mysql和redis的基礎(chǔ)鏡像。

然后我們將這個鏡像進行保存:

sudo docker ps查找鏡像然后sudo docker commit保存鏡像。這部分操作請讀者自行Google解決。

回到宿主機上后我們需要利用Dockerfile來建立我們最終的數(shù)據(jù)庫鏡像。之所以開始不用Dockerfile一步建立鏡像主要是我們采用編譯安裝mysql和redis可能會出錯。

先mkdir一個目錄出來接著進入目錄執(zhí)行 vi Dockerfile在文件中寫下一下內(nèi)容:


Dockerfile內(nèi)容


這里主要的是最后兩句,添加這兩句的原因是開放我們的mysql和redis服務(wù)端口使得其他主機能夠連接我們的數(shù)據(jù)庫服務(wù)。

接著sudo docker build文件建立鏡像。

到此為止我們數(shù)據(jù)庫鏡像已經(jīng)制作完成。


3--web服務(wù)器鏡像

在搭建web服務(wù)器時先安裝httpd通過

yum install -y?httpd即可

然后我們還需要安裝mysql客戶端通過

yum install -y mysql安裝mysql客戶端我們還需要安裝mysql-devel因為在后面我們需要安裝php的mysql擴展缺少這個庫會導(dǎo)致編譯不通過。

安裝完mysql客戶端后還需要安裝redis這里安裝redis是因為我們在訪問數(shù)據(jù)庫服務(wù)器redis時需要本地的redis-cli客戶端,redis的安裝教程上面貼了連接。

安裝nginx以及nginx做代理服務(wù)器可以參考我另外兩篇文章

編譯安裝nginx

nginx負載均衡

最后我們要進行php的安裝。下面鏈接可以完美的進行php的編譯安裝

編譯安裝php

編譯安裝php我能告訴你的就是耐心了。

接下來我們需要安裝php的mysql擴展和redis擴展再貼兩篇文章:

安裝php的mysql擴展

需要注意的是在安裝擴展時有時會提示我們安裝autoconf這時我們直接執(zhí)行

yum install -y autoconf?

這個問題Google的答案是缺少一個依賴庫的問題但是你要是yum那個依賴庫則會自動給你安裝php然后悲劇的事情發(fā)生了yum安裝下的php會替代掉你本來安裝的php。而yum安裝下來的一般是5.3的版本。

接著我們安裝redis擴展:

安裝PHP的redis擴展

到此我們web服務(wù)器鏡像制作完成,docker commit這個容器即可


4--通過--link使得兩個容器間能夠通信

先啟動數(shù)據(jù)庫鏡像

sudo docker run -i -t --name db -P databasemirrorid

sudo docker run -i -t --name web --link db:webdb -P webmirrorid

這時候我們就能夠在web服務(wù)器容器中操作mysql和redis了

通過redis-cli -h db直接連接數(shù)據(jù)庫服務(wù)器中的redis服務(wù)

通過mysql -h db -uroot -ppassword直接訪問數(shù)據(jù)庫服務(wù)器中的mysql服務(wù)。


5--我在安裝時需要的坑

(1)開始時我未用dockerfile來制作數(shù)據(jù)庫鏡像,直接選擇在運行服務(wù)器鏡像的時候通過指定docker run --expose參數(shù)來開放端口,但是找了半天docker --expose貌似不能開放兩個及以上單獨的端口可以開放某一段端口例如 --expose n-m開放n到m這一段的端口,我要開放3306和6379端口的話就要--expose 3306-6379一旦加入這個參數(shù)基本就宣告主機將會卡死,通過sudo ps -aux|grep docker可以看到后臺啟動了大量的docker進程,具體可能跟docker的端口綁定有關(guān)。

(2)在搭建web服務(wù)器是PHP需要與mysql客戶端連接,這時需要要安裝mysql的擴展,由于我們時yum安裝的mysql客戶端缺少mysql-devel依賴庫,導(dǎo)致編譯時一直報錯,然而報錯也未能提示錯誤是由于缺少這個庫,網(wǎng)上找不到靠譜的答案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,851評論 15 147
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 4,021評論 1 66
  • 還記得這個光著腳,笨拙得拿著筆的圣馬太嗎?天使握著他長滿繭的右手,上帝的圣諭就在這個手工勞動者的筆端流淌出來了。當(dāng)...
    c5de959d631b閱讀 562評論 0 4
  • 2017.9.21 星期四 晴 今天,很多家長早早來到教室,聽同學(xué)們的早讀。我因有事,時間來不及,只在李老師...
    暖與希望閱讀 301評論 0 2

友情鏈接更多精彩內(nèi)容