必须用docker快速搭建thinkphp 6.0.2本地环境:拉取php:8.1-fpm-alpine镜像,预建777权限runtime目录;nginx仅挂载public,配置try_files与path_info传递;访问localhost:8080及/index/test验证路由生效。

要在本地快速启动一个可运行、可调试、能访问路由和静态资源的ThinkPHP 6.0.2开发测试环境,必须绕过常见挂载陷阱、PATH_INFO缺失、runtime权限静默失败这三类高频崩盘问题,否则容器一跑就404或空白页。
准备项目与基础镜像
进入宿主机任意空目录,执行命令拉取ThinkPHP 6.0.2稳定版骨架:
git clone --branch v6.0.2 https://gitee.com/top-think/think.git .
确认当前目录下存在 public/index.php 和 app/ 目录;若用 composer create-project,请确保生成的 public/ 是顶层子目录,不是嵌套在 src/ 或其他路径里。
拉取轻量且预装扩展的PHP-FPM基础镜像:
docker pull php:8.1-fpm-alpine
不推荐直接用 webdevops/php-nginx 这类全栈镜像——它默认把整个项目根目录挂进去,【public目录未单独挂载会导致ROOT为空、路由全崩】。
构建专属PHP-FPM容器镜像
在项目根目录新建文件 Dockerfile:
FROM php:8.1-fpm-alpine
RUN apk add --no-cache zip libzip-dev && docker-php-ext-install zip && pecl install redis && docker-php-ext-enable redis && docker-php-ext-configure pdo_mysql && docker-php-ext-install pdo_mysql
RUN mkdir -p /var/www/runtime/{log,cache,route,view} && chmod -R 777 /var/www/runtime
WORKDIR /var/www/html
关键点:RUN 指令中已预创建 runtime 子目录并赋 777 权限,避免容器启动后因 file_put_contents 写入失败导致静默崩溃。
构建镜像:
docker build -t tp6-php:8.1 .
编写 docker-compose.yml 编排服务
在项目根目录创建 docker-compose.yml:
version: '3.8'
services:
php:
image: tp6-php:8.1
volumes:
- ./public:/var/www/html
- ./runtime:/var/www/runtime:rw
networks:
- tp6-net
nginx:
image: nginx:stable-alpine
ports:
- "8080:80"
volumes:
- ./public:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- tp6-net
注意:nginx 容器只挂 ./public,绝不能挂 ./;php 容器 runtime 必须独立挂载,不能混在代码卷里。
创建 ./docker/nginx.conf:
server {
listen 80;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
启动并验证环境
执行命令启动服务:
docker-compose up -d
等待几秒后,检查容器状态:
docker-compose ps
确保 php 和 nginx 状态均为 Up。
验证 Nginx 容器内挂载是否正确:
docker exec -it $(basename $(pwd))_nginx_1 ls -l /var/www/html
输出中应仅含 index.php、static/、router.php —— 若出现 app/ 或 config/,说明挂载路径写错了,立即停掉容器修改 docker-compose.yml。
浏览器访问 http://localhost:8080,看到 ThinkPHP 默认欢迎页即成功;访问 http://localhost:8080/index/test(假设已定义 Test 控制器)能正常响应,证明 PATH_INFO 已生效、路由可用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











