docker搭個(gè)簡(jiǎn)單的lnmp環(huán)境

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)境跑起來。

參考

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

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

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