docker部署php-fpm与nginx
本人被此问题折磨多时,如若不足或有误的地方,欢迎评论指出
php-fpm
Step1
从 docker 拉取 php-fpm 镜像(此处以7.4版本为例)
docker pull php:7.4-fpm
Step2
创建 php-fpm 容器
docker run -itd --name php-fpm \
-v /var/lib/docker/volumes/conf/etc:/usr/local/etc \
-v /www:/var/www/html -p 9000:9000 \
--privileged=true php:7.4-fpm
nginx
Step1
从 docker 拉取 nginx 镜像
docker pull nginx
Step2
创建 nginx 容器
docker run -d --name nginx -p 8080:8080 \
-v /www:/usr/nginx/html \
-v /var/lib/docker/volumes/nginx/_data/conf:/etc/nginx/conf.d \
--link php-fpm
nginx
-i:以交互模式运行容器,通常与-t同时使用
-d:后台运行容器,并返回容器ID
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
–name:容器名称
-p:冒号左边对外端口号:容器端口号(如若使用服务器,请添加对外端口规则)
-v:冒号左边为本机路径:冒号右边为容器内路径(如若容器内无该对应路径则会自动创建)
–privileged=true:使容器内的root拥有真正的root权限
–link:通过已创建的容器名称实现互联
Step3
创建容器成功后可以下列两种方法查看是否link成功:
方法一
进入容器中查看是否有link关系
例:
方法二
ping php-fpm对应ip
docker exec -it nginx bash
apt-get update
apt install iputils-ping
ping ***.**.**.* #此处为php-fpm容器端口,通过在容器外 ps -ef|grep 9000 可得出
注意:如若容器中的文件并未挂载出来,对应服务器目录为空,则无需挂载目录,先把对应容器跑起来
例:Copy nginx容器中default.conf的配置文件至服务器;此命令是在容器外使用,且容器id与容器name都可作为条件cp
docker ps -a #查看容器ID or name sudo docker cp 57tq633x8818:/etc/nginx/conf.d /var/lib/docker/volumes/nginx/_data/conf #docker cp 容器ID:容器目录 本地目录
copy成功后即可再按照上面方法挂载对应目录
Question1:(页面显示)file not found 或者 打开对应php路径直接下载php文件
此问题一般都出现在nginx的配置文件中(default.conf)
解决办法:
server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/nginx/html;
location / {
#伪静态
try_files $uri $uri/ /index.php$is_args$query_string;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/laravel_access.log main;
error_log /var/log/nginx/laravel_error.log warn;
}
以上修改的主要内容在location /{}与location ~ .php${}中,此外还有root路径切记添加