5分钟内让thinkphp或laravel在新服务器开箱即用,需用docker打包代码、php-fpm、nginx和mysql:通过定制dockerfile安装扩展并预设runtime/storage权限,配置nginx正确传递path_info,再用docker-compose联动服务,挂载源码与数据卷,执行docker-compose up -d即可访问。

要让ThinkPHP或Laravel这类PHP框架在新服务器上5分钟内可访问,必须跳过手动装环境、配Nginx、调PHP参数的老路,直接用Docker把代码、运行时、Web服务打包成一个可执行单元——不是“能跑”,而是“开箱即用、权限不报错、路由全生效、换机器照样跑”。
构建可运行的PHP-FPM镜像
这一步决定容器启动后能不能写日志、能不能加载扩展、会不会卡在runtime权限拒绝上。
在项目根目录新建Dockerfile,内容如下:
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y libpng-dev libonig-dev libxml2-dev zip unzip && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo_mysql mbstring gd exif bcmath pcntl
RUN mkdir -p /var/www/runtime /var/www/storage && chown -R www-data:www-data /var/www/runtime /var/www/storage
WORKDIR /var/www/html
COPY . .
RUN composer install --no-dev --optimize-autoloader --no-scripts && chmod +x vendor/bin/think
RUN chown -R www-data:www-data /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
【RUN mkdir -p /var/www/runtime /var/www/storage && chown -R www-data:www-data /var/www/runtime /var/www/storage】 这行不能省——ThinkPHP启动时会立刻尝试写入runtime/app.php,如果目录不存在或权限不对,容器直接退出,报错信息里根本不会提“权限”,只显示“failed to open stream”。
配置Nginx正确转发PATH_INFO
默认Nginx配置下,ThinkPHP的Route::rule()写的路由全部失效,所有请求都打到index.php或返回404,根源就是PATH_INFO没传过去。
在项目根目录新建nginx.conf,内容为:
server {
listen 80;
root /var/www/html/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME /var/www/html/public/index.php;
fastcgi_pass php:9000;
include fastcgi_params;
}
}
注意:fastcgi_param SCRIPT_FILENAME必须写死为/var/www/html/public/index.php,不能用$document_root/index.php——某些基础镜像里$document_root为空,会导致502 Bad Gateway。
用docker-compose联动Nginx、PHP、MySQL
第一步:创建docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports: ["80:80"]
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./src:/var/www/html:ro
depends_on: [php]
php:
build: .
volumes:
- ./src:/var/www/html:ro
- ./runtime:/var/www/html/runtime
- ./storage:/var/www/html/storage
user: "www-data"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: dev123
MYSQL_DATABASE: thinkphp_db
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
第二步:确保项目结构是src/目录下放全部代码(含public、app、runtime等),runtime和storage目录为空但已存在。
第三步:终端进入项目根目录,执行docker-compose up -d。
第四步:等待约15秒,浏览器访问http://localhost,看到ThinkPHP欢迎页即成功。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











