场景:各种原因导致,博主所在公司服务器外网被屏蔽,最开始连docker都是我自己去离线下载再安装的,但是这个会莫名其妙多出很多奇怪的各种配置错误,后面才知道公司内网有docker的下载,但是其他环境没有。于是我我最开始在家里下载了一个php7.2.7和nginx1.140的版本,然后导出再到公司导入到测试服务器里面。
完整docker运行场景和相关配置代码:
1、安装docker就不说了,总之也有些小坑,我们公司是直接
yum install docker
博主之前安装的一直都是
yum install docker-ce docker-ce-cli containerd.io
2、docker导出\导入:博主使用的save导出、load导入方式,这个比较简单,就不多说了
3.查看docker镜像
4.安装容器:先安装php容器、再安装nginx容器,因为nginx容器要依赖于php容器的安装(红色的是特别要注意的,后面配置nginx有关系的)
docker run --name php74fpm -v /docker/nginx/www:/www -itd 1e81510b4806
docker run --name nginx -p 80:80 -itd -v /docker/nginx/www:/usr/share/nginx/html -v /docker/nginx/conf/conf.d:/etc/nginx/conf.d --link php74fpm nginx:latest
5.新建对应的配置的文件和文件夹
docker cp /docker/nginx/www/index.php nginx:/usr/share/nginx/html
docker cp /docker/nginx/conf/conf.d/default.conf nginx:/etc/nginx/conf.d
nginx的配置文件default.conf如下:(位置)/docker/nginx/conf/conf.d
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php?{
fastcgi_pass php74fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}
index.php文件的代码如下:位置/docker/nginx/www
<?php
echo 1111;
echo phpinfo();
?>
安装好之后的容器截图:
踩坑1、curl都打不开
解决:申请开放80端口
踩坑2、无法访问,连普通text,html文件都无法访问
解决:折腾nginx配置文件default.conf配置文件以及docker的php和nginx运行命令,终于可以访问普通文件了。
踩坑3:可以访问html文件,无法访问php文件。连接失败,查看docker具体报错信息如下(只放了开头的部分)
ps:附docker查看报错日志命令
docker logs -t -f 容器id
报错信息如下:
connect() failed (111: Connection refused) while connecting to upstream, client:
解决:
a:刚开始也是各种百度,解决了包括文件权限和nginx、php的用户权限不一致我的问题
b:然后博主就折腾 default.conf这个配置文件,后面看到一篇博文得到启发,说是没有php-fpm(https://blog.csdn.net/weixin_41887155/article/details/107298760?spm=1001.2014.3001.5506) 但是又不方便验证我的设置到底有问题不,于是我记录了docker 的nginx和php运行命令。下班后,用自己的服务器跑了一篇,发现完全没问题,我就重新打包了php和nginx镜像,这次博主选择了nginx最新版和php7.4-fpm版本
c:再次导入,并且折腾了会,发现能正常访问了
这个问题博主总结了几点:
1、是否有加载正常的php-fpm其实可以看php容器运行状态,在端口位置会显示9000/tcp,之前我用的php7.2.7 这个位置我记得很清晰,是空白的。
2、关于default.conf文件的配置问题(前面有我的正常docker命令和这个配置文件)
2.1: root /usr/share/nginx/html; 这个其实是nginx的根目录路径
2.2: fastcgi_pass php74fpm:9000; 中php74fpm是php的容器的名称,9000是php的默认端口
2.3:fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; 这个中的/www/是php的容器里面的对应的源码路径,这个在php容器运行命令有。这个地方的坑我感觉特别多,有说使用/usr/share/nginx/html这个的,也有说使用$script的,也有说使用$document_root 怎么说呢。我这里有点一个一个测试的问题。
2.3.1:我家里使用/usr/share/nginx/html 这个是正确的,当然这个其实也说得过去。原因无他,因为它和/docker/nginx/www 进行同步nginx容器的时候。而/docker/nginx/www又在php容器和/www/进行同步的 (-v命令)。
2.3.2 但是到公司上面个方法就行不通,浏览器会报错file no found 而docker会报错 Primary script unknown 只能用/www/