使用單一進程容器,即一個容器只運行一種服務,而不是把全部服務放在一個容器的設計,讓PHP項目須要的Nginx、PHP、MySQL組件,分別運行在各自鏡像建立出來的獨立容器中。php
文章提到的完整腳本請移步docker-lnmp,內輔詳細的註釋(歡迎你們關注!)。html
整個流程:mysql
具體步驟nginx
Dockerfile:git
MySQL5.7
鏡像,相對獨立解耦的模塊,無其它額外處理,見mysql/Dockerfile。centos7
鏡像,PHP源碼按需編譯安裝,方便後續擴展管理或者配置。經過sed
修改php.in
監聽全部9000
端口(此處爲關鍵!!由於提供Nignx容器訪問支持PHP腳本,PHP容器對於Nginx容器不是localhost
),完整見php7/Dockerfile。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
--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; }
--link mysql:mysql
參數,與MySQL容器共享網絡,相似二者處於同一臺機器,所以PHP代碼鏈接的時候使用$conn = new PDO('mysql:host=mysql;port=3306;dbname=mysql;charset=utf8', 'root', '123456');
就能夠鏈接上MySQL(其中host=mysql
的mysql
爲MySQL容器的名稱,見啓動MySQL容器docker run --name
指定的值)。