Docker多容器部署LNMP环境

使用单一进程容器,即一个容器只运行一种服务,而不是把所有服务放在一个容器的设计,让PHP项目需要的Nginx、PHP、MySQL组件,分别运行在各自镜像创建出来的独立容器中。

文章提到的完整脚本请移步docker-lnmp,内辅详细的注释(欢迎大家关注!)。

整个流程:

  • 客户端http请求服务器80端口,该端口被映射到Nginx容器80端口,进入Nginx处理。
  • Nginx分析请求,如果是静态资源,直接服务器读取内容;如果是PHP脚本,通过PHP容器调用服务器获取脚本,然后FastCGI处理。
  • FastCGI解析PHP脚本,必要时访问MySQL容器读写数据。

具体步骤

Dockerfile:

  • 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

构建镜像:

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

启动容器:

整个流程可以看到,Nginx、PHP、MySQL三者的关系:
Nginx容器---->PHP容器,PHP容器---->MySQL容器。即容器之间是有关联的,两两容器的数据通信通过容器启动命令docker run加参数--link解决。

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:

vi /var/www/html/test.php

<?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指定的值)。

转载于:https://my.oschina.net/u/588516/blog/3069599

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值