docker部署nginx,php环境(步骤+注解)
Contents
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容器之前,我们需要明确我们的需求:
- 我们需要暴露容器的9000端口(用以和主机/nginx交互);
- 映射php配置文件至主机,方便未来修改配置;
- 映射php页面文件至主机,方便未来部署页面;
- 设置容器名字并设置容器后台运行。
此处具体查找容器内相关路径和命令参数的用法详见笔记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容器类似,先明确我们的需求:
- 我们需要暴露容器的80端口(用以将默认http映射至主机80端口,如果有https需求就暴露443端口,可以酌情自定义添加);
- 映射nginx配置文件至主机,方便未来修改配置;
- 映射nginx页面文件至主机,方便未来部署页面;
- 设置容器名字并设置容器后台运行。
首先我们创建一个辅助容器用来获取我们的初始本地文件
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。