docker 搭建lnmp有兩種方式
- 一個(gè)docker容器中集成mysql php nginx
- mysql nginx 和 php 各在一個(gè)容器,多容器聯(lián)合工作
單容器操作簡(jiǎn)單,基于centos的docker鏡像構(gòu)建,其操作與在centos系統(tǒng)上搭建lnmp環(huán)境基本一致,適合入門學(xué)習(xí)。
單容器的-lnmp
單容器的lnmp通過一個(gè) Dockerfile 來構(gòu)建。
寫Dockerfile時(shí)一般是先啟動(dòng)一個(gè)純凈的FROM鏡像(這里是centos:7)
docker run --rm -it centos:7 /bin/bash
# -it 表示以交互終端的方式運(yùn)行
# --rm 表示執(zhí)行完就刪除
這時(shí)候就進(jìn)入鏡像里了,按往常操作步驟搭建 php nginx mysql環(huán)境。并將操作步驟記錄下來,轉(zhuǎn)換成 Dockerfile中的指令。
轉(zhuǎn)換時(shí)注意將步驟合理地合并,畢竟RUN指令不宜太多也不宜太少。
我這里有個(gè)寫好的參考: https://github.com/talkera/docker-lnmp
單容器的缺點(diǎn)是復(fù)用性不強(qiáng),而且格外大:這個(gè)鏡像build下來大約1.9G。
多容器協(xié)作
多容器聯(lián)合工作靈活性更強(qiáng)。只是容器間協(xié)作操作略復(fù)雜。
現(xiàn)在推薦使用docker-compose的方式,只需要配置文件即可。這個(gè)直接看docker-compose.yml文件就能搞明白。
這里也有寫好的一個(gè): https://github.com/talkera/docker-lnmp
不過多容器協(xié)作有幾個(gè)點(diǎn)需要搞清楚
- nginx和php分屬不同容器,但是都需要訪問代碼
- php要暴露fpm的9000端口供nginx訪問,mysql要暴露3306端口給mysql訪問
如果 docker-compose.yml 定義如下
services:
php:
....
myDatabase:
....
nginx:
....
那么nginx配置如下
location ~ \.php$ {
fastcgi_pass php:9000; #php是 php容器的name
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
php連接數(shù)據(jù)庫如下
$pdo = new PDO('mysql:dbname=test;host=myDatabase;port=3306','root',''); //此處的host是 mysql容器的name
docker-compose將幾個(gè)docker連接到一個(gè)虛擬的局域網(wǎng)中,如果要訪問某個(gè)docker可以直接訪問其IP,但是IP一般不固定,所以改用name(如:php, myDatabase)
docker連接宿主機(jī)的mysql
如果mysql單獨(dú)運(yùn)行,php代碼要連接mysql就不能用name了,因?yàn)樗拗鳈C(jī)沒有name
首先查看容器的具體IP地址
docker inspect <容器ID> | grep -i ip
宿主機(jī)IP與容器同網(wǎng)段,而且是XXX.XXX.XXX.1
比如容器查出來ip是192.169.0.2,那么宿主機(jī)ip就是192.168.0.1
在容器內(nèi),可以通過192.168.0.1訪問宿主機(jī)
PHP代碼應(yīng)該變?yōu)?/p>
$pdo = new PDO('mysql:dbname=test;host=192.168.0.1;port=3306','root','');
搭建Docker往往是辛苦一人,造福大家。無論是Dockerfile還是 docker-compose.yml 只要有一個(gè)人寫出來,其他人只需要簡(jiǎn)單看一下就將結(jié)構(gòu)和依賴能了然于心,并且將環(huán)境跑起來。