作為一個程序員,我們在做一個項目的時候弧满,往往需要用到一臺正式的服務(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 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)建的容器
這里我們可以看到我的容器狀態(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í)行腳本