使用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 文件找不到错误。