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关系

例:

cephadm 使用 docker docker php-fpm_cephadm 使用 docker

方法二

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路径切记添加