docker搭建nginx+php环境

docker搭建nginx+php环境

1 准备

1.已安装好docker
2.已在docker中安装好nginx,docker安装nginx可参考我另一篇文章:docker安装nginx并配置SSL

2 docker安装php并启动

因为我之前没用过php,查了一些教程,不少用5.6的,怕踩坑,也用5.6的,不过现在发现用新版本的也没啥问题

docker pull php:5.6-fpm

然后启动php,用-v把本地/data/php(记得创建文件夹)映射到容器的/www目录中

docker run -itd --name myphp -v /data/php:/www -m 55m php:5.6-fpm

或者下面这个更好(加了--restart=always挂掉了会自动重启)

docker run -itd --name myphp -v /data/php:/www --restart=always -m 55m php:5.6-fpm

3 配置nginx

经过查教程,踩了些坑后,摸索出下面两种方式,推荐方式二

3.1 方式一

首先查php容器在docker的内网地址
注意,是docker自己有的一套容器的内网地址,不是自己服务器的内网地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' myphp

看到返回的ip,记录下来,我的是172.17.0.6,然后打开自己的nginx配置文件,在server中加入下面内容

location ~ \.php$ {
        fastcgi_pass   172.17.0.6:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /www/$fastcgi_script_name;
        include        fastcgi_params;
    }

相关说明:
fastcgi_pass 填写自己php的ip和端口,php端口默认是9000
fastcgi_param 填写php脚本地址,nginx匹配到.php结尾的请求后,会转发到php服务器中,因为前面我们docker启动php时配置了/www目录,所以这里也需要配置/www目录,这样php服务器才能够找到相应的php文件
(可自行配置其它目录,docker启动php指定目录和此处nginx配置的目录相同即可 )

最后启动nginx容器即可(我配置了ssl,所以多挂载了一个放置证书的目录,可自行取掉)

docker run -itd --name nginx -p 80:80 -p 443:443 -v /data/nginx/conf.d/nginxl.conf:/etc/nginx/conf.d/nginx.conf -v /data/nginx/conf.d/cert:/etc/nginx/conf.d -v -m 100m nginx

3.2 方式二

打开自己的nginx配置文件,在server中加入下面内容

location ~ \.php$ {
        #root /www;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /www/$fastcgi_script_name;
        include        fastcgi_params;
    }

和上面不同的是,这里的fastcgi_pass配置了php:9000

然后启动nginx容器

docker run -itd --name nginx -p 80:80 -p 443:443 -v /data/nginx/conf.d/nginx.conf:/etc/nginx/conf.d/nginx.conf -v /data/nginx/conf.d/cert:/etc/nginx/conf.d -v --link myphp:php -m 100m nginx

和上面不同的是,多了 --link myphp:php 这个参数
这个可以把前面启动的名为myphp的容器的网络映射为php供nginx容器使用,所以nginx的配置中,fastcgi_pass就能够写成php:9000,docker会自动拿到php服务器的内网ip填充到php:9000中

这种方式更灵活,不需要哪天rm了php-fpm了又得重新去查它的内网ip了

4 使用

建一个test.php脚本文件,里面写

<?php phpinfo(); ?>

保存,放到/data/php中,然后浏览器访问
ip:port/test.php 或者
域名/test.php 试试看吧~