使用docker部署访问php项目

1.拉取需要的镜像

docker pull php:7.4-fpm
docker pull nginx:latest

2.创建有关目录

# 存放php项目
mkdir -p /docker/www  

# 存放nginx配置文件 
mkdir -p /docker/nginx/conf.d

3.编写nginx配置文件

# vim /docker/nginx/conf.d/testdocker.conf

server {
    listen       80;
    server_name  localhost;
    root  /www/qtvcd.com/public; # qtvcd.com为宿主机目录/docker/www下的文件夹,thinkphp项目的根目录
    index index.php index.html index.htm default.php default.htm default.html;
    
    location / {
        if (!-e $request_filename) {
            rewrite  ^(.*)$  /index.php?s=$1  last;   break;
        }
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 100d;
        error_log /dev/null;
        access_log off; 
    }
    location ~ .*\.(js|css)?$ {
        expires 12h;
        error_log /dev/null;
        access_log off; 
    }
    
    location ~ \.php(/|$) {
        fastcgi_index index.php;
        fastcgi_pass  192.168.20.200:9000; # 192.168.20.200为宿主机的ip,不填写php容器的ip
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

4.下载thinkphp5的框架文件

下载地址:https://www.gpsmap.cc/soft/12001.html

https://www.xitongzhijia.net/soft/244793.html

解压缩后把文件夹名修改成:qtvcd.com,并把该目录上传到宿主机的/docker/www路径下

5.启动容器

docker run -d -p 9000:9000 -v /docker/www:/www --name php7.4 php:7.4-fpm
docker run -d  -p 8800:80 -v /docker/www:/www -v /docker/nginx/conf.d:/etc/nginx/conf.d --name nginx nginx:latest

6.访问测试

手动在宿主机目录:/docker/www/qtvcd.com/public下写一个文件:info.php,内容如下:

<?php

phpinfo();

?>

访问测试

php配置文件路径:

注:启动的时候还可以把php镜像的配置文件路径给挂载出来进行使用,需要事先在该目录下写好有关配置文件

比如:先启动php容器镜像,然后把配置文件复制到本地,修改后再在启动容器的时候挂载进去

mkdir -p /docker/php/etc
cd /docker/php/etc
docker cp php7.4:/usr/local/etc/php-fpm.conf .
docker cp php7.4:/usr/local/etc/php-fpm.d/www.conf .

# 修改www.conf文件的参数
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

# 然后停止并删除原有容器,启动新的容器(挂载上配置文件)
docker run -d -p 9000:9000 -v /docker/www:/www -v /docker/php/etc/php-fpm.conf:/usr/local/etc/php-fpm.conf -v /docker/php/etc/www.conf:/usr/local/etc/php-fpm.d/www.conf --name php7.4 php:7.4-fpm

# 查看容器运行日志
# docker logs -f php7.6
[15-Aug-2023 01:48:16] NOTICE: fpm is running, pid 1
[15-Aug-2023 01:48:16] NOTICE: ready to handle connections

# 登录进容器中查看配置文件
# docker exec -it php7.6 /bin/sh
# cd /usr/local/etc/php-fpm.d/
# ls
docker.conf  www.conf  www.conf.default  zz-docker.conf
# cat www.conf (会发现跟刚才修改的配置文件一样)

7.php镜像已包含的模块列表

[root@localhost conf.d]# docker exec -it php7.4 /bin/sh
# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

# 

8.问题

没有安装redis,zip等依赖模块,解决办法参考这篇文章:https://www.cnblogs.com/hahaha111122222/p/17629211.html

9.nginx采用传统方式部署,只有php采用镜像容器启动

1.安装好nginx后,配置文件内容如下

# vim /etc/nginx/conf.d/thinkphp5.conf

server {
    listen       80;
    server_name  localhost;
    root  /usr/share/nginx/html/thinkphp5/public; # thinkphp5为宿主机目录/usr/share/nginx/html下的文件夹,thinkphp项目的根目录,不是thinkphp5项目的话,可以直接配置成:root  /usr/share/nginx/html;
    index index.php index.html index.htm default.php default.htm default.html;
    
    location / {
        if (!-e $request_filename) {
            rewrite  ^(.*)$  /index.php?s=$1  last;   break;
        }
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 100d;
        error_log /dev/null;
        access_log off; 
    }
    location ~ .*\.(js|css)?$ {
        expires 12h;
        error_log /dev/null;
        access_log off; 
    }
    
    location ~ \.php(/|$) {
        fastcgi_index index.php;
        fastcgi_pass  192.168.20.200:9000; # 192.168.20.200为宿主机的ip,不填写php容器的ip
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

2.启动php容器,注意挂载的路径

docker run -d -p 9000:9000 -v /usr/share/nginx/html:/usr/share/nginx/html --name php7.4 php:7.4-fpm

把宿主机的/usr/share/nginx/html挂载到容器的/usr/share/nginx/html路径下,再结合nginx配置文件中的写法,从而实现访问php文件

总结起来,就是nginx配置文件中的路径,要跟挂载到容器中的路径保持一致才行,不然访问就会报404 文件找不到错误。

posted @ 2023-08-14 16:07  哈喽哈喽111111  阅读(320)  评论(0编辑  收藏  举报