使用单一进程容器,即一个容器只运行一种服务,而不是把全部服务放在一个容器的设计,让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
指定的值)。