基于Docker搭建LNMP環(huán)境

作為一個程序員,我們在做一個項目的時候弧满,往往需要用到一臺正式的服務(wù)器和一臺測試的服務(wù)器。如果你的主機配置足夠好此熬,那么庭呜,你可以利用虛擬機在同一臺主機上裝多臺Web應(yīng)用的服務(wù)器。當然犀忱,土豪公司的話也可以多用幾臺機器去搭建服務(wù)器募谎。但是,這些都不是最好的解決辦法阴汇,最好的辦法就是使用Docker数冬。使用docker可以在一臺機器上搭建多臺服務(wù)器,它沒有傳統(tǒng)虛擬機那么笨重搀庶,而且消耗的系統(tǒng)資源也相對較少拐纱。并且它是一個隔離的環(huán)境,任你在容器里面攪得天昏地暗哥倔,對host OS也不會有任何影響秸架。因此它的安全性也很高

關(guān)于什么是docker,建議大家先上網(wǎng)查查有關(guān)的用法咆蒿。如果您不了解东抹,在這篇文章中,您可以簡單的理解為他是一個輕量級的虛擬機沃测。

一缭黔、docker安裝mysql
首先,我們從倉庫拉取一個MySql的鏡像

docker pull mysql:5.6

然后我們可以通過命令 docker images 查看我們剛剛拉下來的mysql的鏡像

docker images

接下來蒂破,我們就開始運行并啟動一個容器试浙,通過以下命令

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=xy123456 --name xy_mysql mysql:5.6

參數(shù)說明
-d 讓容器在后臺運行
-p 添加主機到容器的端口映射
-e 設(shè)置環(huán)境變量,這里是設(shè)置mysql的root用戶的初始密碼寞蚌,這個必須設(shè)置
–name 容器的名字田巴,隨便取,但是必須唯一

ps:其實我們可以僅僅使用docker run命令就行了挟秤。docker run會先去pull壹哺,然后再create。個人習(xí)慣先把鏡像pull下來艘刚,在run的時候會很快管宵。

接下來我們就可以通過命令docker ps -a 查看我們剛剛創(chuàng)建的容器

docker ps -a

這里我們可以看到我的容器狀態(tài)的Up狀態(tài),表示容器正在運行攀甚,并且把可以看到主機和容器的端口映射關(guān)系箩朴。

接下來,我們就可以進入到我們剛剛創(chuàng)建的容器中秋度,輸入命令

docker exec -ti xy_mysql /bin/bash

參數(shù)說明
-t 在容器里生產(chǎn)一個偽終端
-i 對容器內(nèi)的標準輸入 (STDIN) 進行交互

容器中默認是沒有vim的炸庞,所以我們首先要安裝vim,需要注意的是安裝前記得先執(zhí)行apt update命令,不然安裝會出現(xiàn)問題荚斯。
進入到mysql容器后埠居,我們通過創(chuàng)建一個遠程可以訪問的用戶,這樣我們就能從別的主機訪問到我們的數(shù)據(jù)庫了事期。

二滥壕、docker安裝php-fpm
同樣首先我們拉取php-fpm的鏡像

docker pull php:7.0-fpm

再創(chuàng)建一個phpfpm容器

docker run -d -v /var/nginx/www/html:/var/www/html -p 9000:9000 --link xy_mysql:mysql --name xy_phpfpm php:7.0-fpm 

參數(shù)說明
-d 讓容器在后臺運行
-p 添加主機到容器的端口映射
-v 添加目錄映射,即主機上的/var/nginx/www/html和容器中/var/www/html目錄是同步的
–name 容器的名字
–link 與另外一個容器建立起聯(lián)系兽泣,這樣我們就可以在當前容器中去使用另一個容器里的服務(wù)绎橘。

這里如果不指定–link參數(shù)其實也是可以得,因為容易本身也是有ip的且唯一唠倦,所以我們也可以直接利用ip去訪問容器称鳞。

然后進入到我們的容器,然后我們在/var/www/html目錄下新建一個index.php文件

touch index.php

我們可以看到該目錄下新建了一個php文件
接下來我們回到我們的主機上面牵敷,訪問一下我們主機上/var/nginx/www/html
[圖片上傳中...(image-49cf22-1514939750417-2)]

我們發(fā)現(xiàn)我們在容器里的/var/www/html目錄中新建的文件也在主機的/var/nginx/www/html目錄中胡岔,因為在創(chuàng)建容器的時候,我們已經(jīng)把主機中的目錄掛載到了容器中去了枷餐。

因為后面我要使用pdo模塊進行測試靶瘸,所以我需要自己安裝pdo_mysql模塊,在docker容器中可以這樣來安裝

docker-php-ext-install pdo_mysql

然后我們可以通過命令php -m查看我們的php的所有擴展模塊毛肋,我們可以去看到我們剛剛安裝的pdo_mysql擴展也在里面
[圖片上傳中...(image-796fc6-1514939750417-1)]

三怨咪、docker安裝nginx
首先,我們從倉庫里去拉取一個nginx鏡像

docker pull ngixn:1.10.3

接下來運行nginx容器

docker run -d -p 80:80 --name xy_nginx\ 
-v /var/nginx/www/html:/var/www/html\
--link xy_phpfpm:phpfpm --name xy_nginx nginx:1.10.3

參數(shù)說明:

-d 讓容器在后臺運行
-p 添加主機到容器的端口映射
-v 添加目錄映射,這里最好nginx容器的根目錄最好寫成和php容器中根目錄一樣润匙。但是不一點非要一模一樣,如果不一樣在配置nginx的時候需要注意
–name 容器的名字
–link 與另外一個容器建立起聯(lián)系

然后進入nginx容器诗眨,修改nginx的配置文件讓它支持php

docker exec -ti xy_nginx /bin/bash

參數(shù)說明
-t 在容器里生產(chǎn)一個偽終端
-i 對容器內(nèi)的標準輸入 (STDIN) 進行交互

在容器里找到nginx的配置文件,默認是在/etc/nginx目錄下

location ~ \.php$ {
        root           /var/www/html;
        fastcgi_index  index.php;
        fastcgi_pass   phpfpm:9000;//這里改成我們之前--link進來的容器孕讳,也可以直接用php容器的ip
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcdi_script_name;//如果你的根目錄和php容器的根目錄不一樣匠楚,這里的$document_root需要換成你php下的根目錄巍膘,不然php就找不到文件了
        include        fastcgi_params;                                                                                                                                               

    }

最后,我們來測試一下我們的安裝是否成功

<?php
try {
    $con = new PDO('mysql:host=mysql;dbname=test', 'xuye', 'xy123456');
    $con->query('SET NAMES UTF8');
    $res =  $con->query('select * from test');
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
        echo "id:{$row['id']} name:{$row['name']}";
    }
} catch (PDOException $e) {
     echo '錯誤原因:'  . $e->getMessage();
}

這里寫圖片描述

當當當芋簿,看到正確的輸出峡懈,就證明我們的配置成功了。一個最最最基本的環(huán)境就搭建好了与斤。是不是很簡單肪康?

不知道大家有沒有注意到我測試代碼中的

$con = new PDO('mysql:host=mysql;dbname=test', 'xuye', 'xy123456');

這一行,我新建容器的時候并沒有把mysql容器link進來撩穿,這里的host我直接用mysql也能成功磷支,為什么呢?因為真正執(zhí)行這段代碼的是php容器食寡,(如果不清楚nginx和php之間的關(guān)系雾狈,最好先上網(wǎng)查資料弄清楚)而之前我們在php容器里把php容器link進去了,所以這里是可行的冻河,當前換成mysql容器的ip也是一樣的箍邮,可以通過dokcer inspect contanier_name|id來查看容器的有關(guān)信息, 不過只能在內(nèi)網(wǎng)里面使用容器的ip叨叙。如果你想在外網(wǎng)訪問容器里的mysql锭弊,還是要通過主機的公網(wǎng)ip:port這種形式來訪問。

ps:上面我們都是通過輸入一條條命令去創(chuàng)建容器擂错,為了更高效的創(chuàng)建容器味滞,我們可以事先寫一個shell腳本,把這些命令打包钮呀,通過命令sh ***.sh去執(zhí)行腳本

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剑鞍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爽醋,更是在濱河造成了極大的恐慌蚁署,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚂四,死亡現(xiàn)場離奇詭異光戈,居然都是意外死亡,警方通過查閱死者的電腦和手機遂赠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門久妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跷睦,你說我怎么就攤上這事筷弦。” “怎么了抑诸?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵烂琴,是天一觀的道長爹殊。 經(jīng)常有香客問我,道長监右,這世上最難降的妖魔是什么边灭? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮健盒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘称簿。我一直安慰自己扣癣,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布憨降。 她就那樣靜靜地躺著父虑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪授药。 梳的紋絲不亂的頭發(fā)上士嚎,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音悔叽,去河邊找鬼莱衩。 笑死,一個胖子當著我的面吹牛娇澎,可吹牛的內(nèi)容都是我干的笨蚁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼趟庄,長吁一口氣:“原來是場噩夢啊……” “哼括细!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戚啥,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奋单,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猫十,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览濒,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年炫彩,在試婚紗的時候發(fā)現(xiàn)自己被綠了匾七。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡江兢,死狀恐怖昨忆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杉允,我是刑警寧澤邑贴,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布席里,位于F島的核電站,受9級特大地震影響拢驾,放射性物質(zhì)發(fā)生泄漏奖磁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一繁疤、第九天 我趴在偏房一處隱蔽的房頂上張望咖为。 院中可真熱鬧,春花似錦稠腊、人聲如沸躁染。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吞彤。三九已至,卻和暖如春叹放,著一層夾襖步出監(jiān)牢的瞬間饰恕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工井仰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埋嵌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓糕档,卻偏偏與公主長得像莉恼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子速那,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容