docker 部署nginx+php
最近在学习docker,准备搭建 nginx + php
开发环境,记录一下搭建过程,先给一份的docker-compose.yml
部署配置
version: '3'
services:
nginx:
container_name: mynginx
image: nginx
ports:
- '80:80'
volumes:
- '/etc/nginx/:/etc/nginx' #配置
- '/var/log/nginx/:/var/log/nginx/' #日志
- '/data/php/yxyy/html:/data/php/yxyy/html' #项目路径
php:
container_name: myphp
image: php:7.2-fpm
volumes:
- '/data/php/yxyy/html/:/data/php/yxyy/html/'
- '/usr/local/php7.2/:/usr/local/etc/'
下面是我整个搭建学习过程,dockers的安装就不记录了,下面记录nginx+php搭建过程(前面是有问题的,别照抄哦)
nginx
先安装一个临时 nginx 容器
docker run --name tmpnginx -d -p 80:80 nginx
在浏览器上输入 127.0.0.1
出现熟悉的界面,美滋滋,进入tmpnginx容器
docker exec -it tmpnginx /bin/bash
搜索配置文件位置
find / -name nginx.conf #找到配置文件在/ect/nginx 里
拷贝一份容器nginx配置到宿主 /ect/nginx
里
docker cp tmpnginx:/ect/nginx /ect/nginx
修改nginx 配置,如/etc/nginx/conf.d/default.conf
的站点根目录等信息,我的项目在/data/php/yxyy/html
删掉tmpnginx容器并启动一个挂载自定义配置文件的容器
docker run --name mynginx -d -p 80:80 \
-v /ect/nginx:/ect/nginx \
-v /var/log/nginx/:/var/log/nginx/ \
-v /data/php/yxyy/html/:/data/php/yxyy/html/ nginx
配置文件说明
/ect/nginx
:nginx配置目录/var/log/nginx
:nginx日志/data/php/yxyy/html
:项目目录
在浏览器上 输入127.0.0.1
验证正常
PHP
php的安装过程也和nginx类似,我用的镜像是php:7.2-fpm
,下面是我的安装过程:
docker run --name tmpphp -d -p 80:80 php:7.2-fpm #安装一个临时 php:7.2-fpm 容器
docker exec -it tmpphp /bin/bash #进入容器
find / -name php-fpm.conf #找到配置文件在/usr/local/etc/ 里
docker cp tmpnginx:/usr/local/etc/ /usr/local/php7.2/ #拷贝一份容器配置
docker run --name mynginx -d -p 9000:9000 \
-v /usr/local/php7.2/:/usr/local/etc/ \
-v /data/php/yxyy/html/:/data/php/yxyy/html/ php:7.2-fpm
到了此时我以为好了,浏览器访问一下,结果显示502
502
查看nginx 日志显示如下:
*19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
连接有问题,查看拍PHP容器是否起来了:
docker ps #得到的结果显示php容器起来了
查看php容器的日志:
docker logs myphp #也没错误
查看宿主主机进程:
ps -ef | grep php #php master 和 worker 进程也有了,坑爹啊
既然进程都有了,那只能是他们通信出了问题,在宿主主机上telnet :
telnet 127.0.0.1 9000 #可以正常连接
莫非容器之间不能通信,找一下资料看还真是,但想验证一下:
#进入mynginx 容器 telnet 127.0.0.1 9000 ,没 telnet ....
#好吧那就安装,安装好后 telnet 127.0.0.1 9000 拒绝,到这里确认是不能直接通信了
重新运行nginx容器,加上--link myphp
docker run --name mynginx -d -p 80:80 --link myphp \
-v /ect/nginx:/ect/nginx \
-v /var/log/nginx/:/var/log/nginx/ \
-v /data/php/yxyy/html/:/data/php/yxyy/html/ nginx
理想很美,现实是残酷的,还是不能通信,看资料说 --link 要废弃了,我安装的 docker 比较新,猜测有可能是这个原因,换一种方法 docker-compose 集群管理方式来启动,下面是docker-compose.yml
配置:
docker-compose up -d
version: '3'
services:
nginx:
container_name: mynginx
image: nginx
ports:
- '80:80'
volumes:
- '/etc/nginx/:/etc/nginx' #配置
- '/var/log/nginx/:/var/log/nginx/' #日志
- '/data/php/yxyy/html:/data/php/yxyy/html' #项目路径
php:
container_name: myphp
image: php:7.2-fpm
volumes:
- '/data/php/yxyy/html/:/data/php/yxyy/html/'
- '/usr/local/php7.2/:/usr/local/etc/'
经过一顿操作猛如虎,一看结果二百五,还是不行,此时都想把电脑砸了,进入容器:
telnet 127.0.0.1 9000 #还是联不通,突发奇想,把 127.0.0.1 换成容器名称会怎样呢?
telnet myphp 9000 #居然可以了,此时一股幸福感悠然而生,幸福来得太突然了
修改nginx配置,把127.0.0.1
改为myphp(容器名)
重启,高光时刻来了,然鹅。事实上我想多了, 502 是解决了, 404 不期而遇
404
File not found
看到 404 我第一反应路径不对 ,再三确认后路径没问题,想来只能是权限问题了,查看nginx日志:
*32 FastCGI sent in stderr: "Primary script unknown" while reading response header
ls -l
查看确实是没权限,看到没权限会心一笑,小意思。给个777
权限看看。结果很遗憾,还是不行,既然不行
那全部给root
用户执行看看,修改配置nginx.conf , user = root
, php-fmt 的 www.conf
配置 , user = root group = root
, 重启容器查看还是不行。查看容器日志docker logs phpxxx
显示
ERROR: [pool www] please specify user and group other than root
php不能使用root执行,那全部改为nginx
,结果还是不行,
cat /etc/passwd
查看没有此用户,只有 php 的 www-data
用户,修改nginx和php配置,都改为www-data
用户,重启。
终于可以了