基於Docker搭建LNMP環境

weixin_34249678發表於2018-01-03

作為一個程式設計師,我們在做一個專案的時候,往往需要用到一臺正式的伺服器和一臺測試的伺服器。如果你的主機配置足夠好,那麼,你可以利用虛擬機器在同一臺主機上裝多臺Web應用的伺服器。當然,土豪公司的話也可以多用幾臺機器去搭建伺服器。但是,這些都不是最好的解決辦法,最好的辦法就是使用Docker。使用docker可以在一臺機器上搭建多臺伺服器,它沒有傳統虛擬機器那麼笨重,而且消耗的系統資源也相對較少。並且它是一個隔離的環境,任你在容器裡面攪得天昏地暗,對host OS也不會有任何影響。因此它的安全性也很高

關於什麼是docker,建議大家先上網查查有關的用法。如果您不瞭解,在這篇文章中,您可以簡單的理解為他是一個輕量級的虛擬機器。

一、docker安裝mysql
首先,我們從倉庫拉取一個MySql的映象

docker pull mysql:5.6

然後我們可以通過命令 docker images 檢視我們剛剛拉下來的mysql的映象

6954572-f5619b459dbedc53
docker images

接下來,我們就開始執行並啟動一個容器,通過以下命令

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

引數說明
-d 讓容器在後臺執行
-p 新增主機到容器的埠對映
-e 設定環境變數,這裡是設定mysql的root使用者的初始密碼,這個必須設定
–name 容器的名字,隨便取,但是必須唯一

ps:其實我們可以僅僅使用docker run命令就行了。docker run會先去pull,然後再create。個人習慣先把映象pull下來,在run的時候會很快。

接下來我們就可以通過命令docker ps -a 檢視我們剛剛建立的容器

6954572-13732b4bff63c17d
docker ps -a

這裡我們可以看到我的容器狀態的Up狀態,表示容器正在執行,並且把可以看到主機和容器的埠對映關係。

接下來,我們就可以進入到我們剛剛建立的容器中,輸入命令

docker exec -ti xy_mysql /bin/bash

引數說明
-t 在容器裡生產一個偽終端
-i 對容器內的標準輸入 (STDIN) 進行互動

容器中預設是沒有vim的,所以我們首先要安裝vim,需要注意的是安裝前記得先執行apt update命令,不然安裝會出現問題。
進入到mysql容器後,我們通過建立一個遠端可以訪問的使用者,這樣我們就能從別的主機訪問到我們的資料庫了。

二、docker安裝php-fpm
同樣首先我們拉取php-fpm的映象

docker pull php:7.0-fpm

再建立一個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 

引數說明
-d 讓容器在後臺執行
-p 新增主機到容器的埠對映
-v 新增目錄對映,即主機上的/var/nginx/www/html和容器中/var/www/html目錄是同步的
–name 容器的名字
–link 與另外一個容器建立起聯絡,這樣我們就可以在當前容器中去使用另一個容器裡的服務。

這裡如果不指定–link引數其實也是可以得,因為容易本身也是有ip的且唯一,所以我們也可以直接利用ip去訪問容器。

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

touch index.php

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

我們發現我們在容器裡的/var/www/html目錄中新建的檔案也在主機的/var/nginx/www/html目錄中,因為在建立容器的時候,我們已經把主機中的目錄掛載到了容器中去了。

因為後面我要使用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

引數說明:

-d 讓容器在後臺執行
-p 新增主機到容器的埠對映
-v 新增目錄對映,這裡最好nginx容器的根目錄最好寫成和php容器中根目錄一樣。但是不一點非要一模一樣,如果不一樣在配置nginx的時候需要注意
–name 容器的名字
–link 與另外一個容器建立起聯絡

然後進入nginx容器,修改nginx的配置檔案讓它支援php

docker exec -ti xy_nginx /bin/bash

引數說明
-t 在容器裡生產一個偽終端
-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();
}

6954572-fd23a959b6adb121
這裡寫圖片描述

噹噹噹,看到正確的輸出,就證明我們的配置成功了。一個最最最基本的環境就搭建好了。是不是很簡單?

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

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

這一行,我新建容器的時候並沒有把mysql容器link進來,這裡的host我直接用mysql也能成功,為什麼呢?因為真正執行這段程式碼的是php容器,(如果不清楚nginx和php之間的關係,最好先上網查資料弄清楚)而之前我們在php容器裡把php容器link進去了,所以這裡是可行的,當前換成mysql容器的ip也是一樣的,可以通過dokcer inspect contanier_name|id來檢視容器的有關資訊, 不過只能在內網裡面使用容器的ip。如果你想在外網訪問容器裡的mysql,還是要通過主機的公網ip:port這種形式來訪問。

ps:上面我們都是通過輸入一條條命令去建立容器,為了更高效的建立容器,我們可以事先寫一個shell指令碼,把這些命令打包,通過命令sh ***.sh去執行指令碼

相關文章