Docker多容器部署LNMP環境

使用單一進程容器,即一個容器只運行一種服務,而不是把全部服務放在一個容器的設計,讓PHP項目須要的Nginx、PHP、MySQL組件,分別運行在各自鏡像建立出來的獨立容器中。php

文章提到的完整腳本請移步docker-lnmp,內輔詳細的註釋(歡迎你們關注!)。html

整個流程:mysql

  • 客戶端http請求服務器80端口,該端口被映射到Nginx容器80端口,進入Nginx處理。
  • Nginx分析請求,若是是靜態資源,直接服務器讀取內容;若是是PHP腳本,經過PHP容器調用服務器獲取腳本,而後FastCGI處理。
  • FastCGI解析PHP腳本,必要時訪問MySQL容器讀寫數據。

具體步驟nginx

Dockerfile:git

  • MySQL鏡像
    繼承自官方的MySQL5.7鏡像,相對獨立解耦的模塊,無其它額外處理,見mysql/Dockerfile
  • PHP鏡像
    繼承自官方的centos7鏡像,PHP源碼按需編譯安裝,方便後續擴展管理或者配置。經過sed修改php.in監聽全部9000端口(此處爲關鍵!!由於提供Nignx容器訪問支持PHP腳本,PHP容器對於Nginx容器不是localhost),完整見php7/Dockerfile
  • Nginx鏡像
    繼承自官方的centos7鏡像,Nginx源碼按需編譯安裝,方便後續更改或者配置。經過sed修改nginx.conf增長對PHP腳本的支持,完整見nginx/Dockerfile

構建鏡像:github

docker build --tag addcn/mysql -f mysql/Dockerfile .
docker build --tag addcn/php7 -f php7/Dockerfile .
docker build --tag addcn/nginx -f nginx/Dockerfile .

啓動容器:web

整個流程能夠看到,Nginx、PHP、MySQL三者的關係:
Nginx容器---->PHP容器,PHP容器---->MySQL容器。即容器之間是有關聯的,兩兩容器的數據通訊經過容器啓動命令docker run加參數--link解決。sql

docker run --name mysql -p 3306:3306 -v /root/bo/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it addcn/mysql
docker run --name php7 -p 9000:9000 -v /var/www/html:/usr/local/nginx/html --link mysql:mysql -it addcn/php7
docker run --name nginx -p 80:80 -v /var/www/html:/usr/local/nginx/html --link php7:php7 -it addcn/nginx

測試 PHP & MySQL:docker

vi /var/www/html/test.phpcentos

<?php
//date
echo date("Y-m-d H:i:s")."<br />\\n";

//mysql
try {
    $conn = new PDO('mysql:host=mysql;port=3306;dbname=mysql;charset=utf8', 'root', '123456');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
//$conn->exec('set names utf8');
$sql = "SELECT * FROM `user` WHERE 1";
$result = $conn->query($sql);
while($rows = $result->fetch(PDO::FETCH_ASSOC)) {
    echo $rows['Host'] . ' ' . $rows['User']."<br />\\n";
}

//phpinfo
phpinfo();
?>

客戶端瀏覽:
http://192.168.8.36/test.php
![Docker運行PHP及輸出MySQL表][1]
[1]: https://raw.githubusercontent.com/addcn/docker-lnmp/master/docs/docker-lnmp.png

Q&A

  • Nginx如何支持PHP腳本?
    Nginx容器啓動時候,經過--link php7:php7參數共享PHP容器的網絡,配置nginx.conf文件(見nginx/Dockerfile),當處理PHP腳本時,轉給PHP容器解析:
location ~ \\.php$ {
    root           html;
    fastcgi_pass   php7:9000;  #此處爲關鍵!!其中php7爲PHP容器的名稱,見啓動PHP容器docker run --name指定的值
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name; #關鍵!!/usr/local/nginx/html爲web目錄
    include        fastcgi_params;
}
  • PHP如何讀取MySQL數據?
    PHP容器啓動時候,經過--link mysql:mysql參數,與MySQL容器共享網絡,相似二者處於同一臺機器,所以PHP代碼鏈接的時候使用$conn = new PDO('mysql:host=mysql;port=3306;dbname=mysql;charset=utf8', 'root', '123456');就能夠鏈接上MySQL(其中host=mysqlmysql爲MySQL容器的名稱,見啓動MySQL容器docker run --name指定的值)。
相關文章
相關標籤/搜索