docker部署nginx,php环境(步骤+注解)

nginx、php连接关系简介

nginx是现今常用的web服务器,其特点是轻量级高并发,非常适合我们个人的web服务搭建,但是和Apache一样,nginx只能处理静态页面,不能应付现在越来越多的动态请求。这些动态请求就要靠php来处理,这也是我们需要将nginx和php搭配起来使用的原因。
php是一种创建动态交互性站点的强有力的服务器端脚本语言,在和nginx配合时,推荐使用php-fpm(PHP FastCGI Process Manager),也即PHP FastCGI 进程管理器。简单的说,php-fpm就是可以快速解析php请求,并且返回结果的程序,最适合和web服务器搭配快速高效实现动态页面效果。从php5开始,php就已经内置fpm组件了,所以使用php也可,但是本文仍将以php-fpm举例。

总结来说,当用户有一个动态页面请求时,会统一先交由nginx接管,nginx会把动态部分通过本机端口传递给php-fpm处理,php-fpm处理结束后将结果通过端口回传给nginx,由nginx将最终页面呈现给用户,从而完成一次请求任务。(默认的php传输端口是9000)。


docker部署php-fpm容器

首先从镜像源拉取php-fpm镜像。

docker pull php:7.4-fpm

docker pull拉取镜像以及配置代理和国内镜像源的操作可以看笔记docker国内镜像源配置及走代理设置

准备php-fpm挂载文件

在创建php容器之前,我们需要明确我们的需求:

  1. 我们需要暴露容器的9000端口(用以和主机/nginx交互);
  2. 映射php配置文件至主机,方便未来修改配置;
  3. 映射php页面文件至主机,方便未来部署页面;
  4. 设置容器名字并设置容器后台运行。
    此处具体查找容器内相关路径和命令参数的用法详见笔记docker容器基础使用与技巧

首先我们创建一个辅助容器用来获取我们的初始本地文件

docker run -p 9000:9000 -d --name php.0 php:7.4-fpm

创建准备用来挂载php配置文件夹与页面文件夹的本地文件夹,并copy容器内文件到本地路径

mkdir /home/user/www/html       #映射页面文件的本地路径
mkdir /home/user/php-fpm        #映射配置文件的本地路径
docker cp php.0:/usr/share/nginx/html/* /home/user/www/html     #copy全部页面文件至本地路径
docker cp php.0:/usr/local/etc/php/* /home/user/php-fpm         #copy全部配置文件至本地路径
docker stop php.0 && docker rm php.0        #停止并删除辅助容器

这样准备工作就全部做好了。

创建含有映射的php-fpm容器

创建并后台运行php-fpm容器

docker run -p 9000:9000 -d --name php.1 -v /home/user/www/html:/usr/share/nginx/html -v /home/user/php-fpm:/usr/local/etc/php/ php:7.4-fpm

可通过docker ps查看容器php.1的运行状态以及端口映射状态是否正常。

docker部署nginx容器

首先从镜像源拉取nginx镜像。

docker pull nginx       #可以不指定版本tag,默认拉取nginx:latest版本

准备nginx配置及网页文件

和创建php-fpm容器类似,先明确我们的需求:

  1. 我们需要暴露容器的80端口(用以将默认http映射至主机80端口,如果有https需求就暴露443端口,可以酌情自定义添加);
  2. 映射nginx配置文件至主机,方便未来修改配置;
  3. 映射nginx页面文件至主机,方便未来部署页面;
  4. 设置容器名字并设置容器后台运行。

首先我们创建一个辅助容器用来获取我们的初始本地文件

docker run --name nginx.0 -p 80:80 -d nginx

创建准备用来挂载nginx配置文件夹与页面文件夹的本地文件夹,并copy容器内文件到本地路径

mkdir /home/user/www/html       #映射页面文件的本地路径
mkdir /home/user/nginx/conf.d       #映射配置文件的本地路径
docker cp nginx.0:/usr/share/nginx/html/* /home/user/www/html       #copy全部页面文件至本地路径
docker cp /etc/nginx/conf.d* /home/user/nginx/conf.d            #copy全部配置文件至本地路径
docker stop nginx.0 && docker rm nginx.0        #停止并删除辅助容器

这样准备工作就全部做好了。

创建含有映射的nginx容器

创建并后台运行nginx容器

docker run --name nginx.1 -p 80:80 -d -v /home/user/www/html:/usr/share/nginx/html -v /home/user/nginx/conf.d:/etc/nginx/conf.d nginx

可通过docker ps查看容器nginx.1的运行状态以及端口映射状态是否正常。
此时可以在浏览器地址栏输入主机的ip地址,就能看见nginx的默认页面了。

配置nginx以连接php-fpm

虽然两个容器都已经成功运行,但是默认的nginx配置仍然只能处理静态页面,我们需要修改nginx配置文件使得nginx能够把动态请求传递至php的端口。
nginx的默认页面(即http请求的默认80端口)配置文件在/etc/nginx/conf.d/default.conf。由于我们已经将路径映射到了主机路径/home/user/nginx/conf.d,我们cd进入此路径,备份一下default.conf,然后在default.conf的基础上,把文件修改为类似如下这样:

server {
    listen       80;    #监听80端口
    listen  [::]:80;
    server_name  localhost;     #也可以填写自己注册的域名
    location / {
        root   /usr/share/nginx/html;   #当前配置的页面文件根目录
        index  index.php index.html index.htm;  #添加index.php作为默认首页
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;        #错误页面设置
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # 与php-fpm通信的关键设置
    location ~ \.php$ {
         root   /usr/share/nginx/html;  #页面文件根目录
         fastcgi_pass   php.1容器的ip:9000;    #php-fpm的通信端口,由于已经将容器9000端口映射到了主机的9000端口,所以这里填“主机ip:9000”也是可以的。
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
         fastcgi_param  SCRIPT_NAME     $fastcgi_script_name;
         include        fastcgi_params;
    }
}

注意,容器php.1的ip可以通过命令docker inspect php.2 | grep "IPAddress"获取

lichen@raspberry:~/nginx/conf.d $  docker inspect php.2 | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
         "IPAddress": "172.17.0.2",

此处容器php.1的ip:端口就是172.17.0.2:9000
修改nginx配置文件后,需要重启nginx容器docker restart nginx.1
编写php测试页面,进入我们映射好的容器页面文件根目录/home/user/www/html文件夹,新建测试页面vim index.php
并把文件编辑为:

<!DOCTYPE html>
<html>
<body>

<?php
echo "Hello World!";
?>

</body>
</html>

保存文件后,在浏览器地址栏输入主机的ip地址,如果能看见“Hello World!”,那我们的nginx容器和php-fpm容器就连接成功啦。

继续配置mysql和phpmyadmin

作为一个web应用的服务器,一般还会安装数据库mysql,一起组成LNMP环境。

LNMP = Linux + Nginx + Mysql + PHP

并通过phpmyadmin管理数据库。
如何通过docker配置mysql + phpmyadmin,可以见笔记XXXXXXXXXXXXXX。