ThinkPHP部署Docker只需三步:选对基础镜像并装全扩展(pdo_mysql、gd、opcache等)、提前创建并正确挂载runtime目录(chmod 777 + 单独rw挂载)、配置Nginx转发路由至index.php且传参完整。

ThinkPHP部署Docker容器,新手不用怕——核心就三件事:环境搭对、权限设好、路由通顺。不是代码写错了,而是容器里少配了一行 nginx 规则,或 runtime 目录根本写不进去。
基础镜像选对,PHP扩展装全
别直接用 php:8.1-cli 或纯 Alpine 镜像起步,新手推荐 php:8.1-apache(带 Apache 服务,开箱即用)或 php:8.1-fpm + nginx(更贴近生产,但需额外配 Nginx 容器)。无论哪种,都要装上 ThinkPHP 必需的扩展:
- pdo_mysql(连数据库)
- gd(图像处理)
- opcache(性能优化)
- mbstring、xml、json(框架底层依赖)
在 Dockerfile 里写清楚:
RUN docker-php-ext-install pdo_mysql gd opcache \
&& docker-php-ext-enable opcacheruntime 和 storage 目录必须“提前安排”
容器一跑就报 Permission denied?90% 是 runtime 目录没权限。关键不是“等容器起来再 chown”,而是构建时就创建、运行时就隔离:
立即学习“PHP免费学习笔记(深入)”;
- Dockerfile 中提前建目录并设宽松权限:
RUN mkdir -p /var/www/html/runtime/{log,cache,route,view} && chmod -R 777 /var/www/html/runtime - docker-compose.yml 里分开挂载:
volumes: - ./app:/var/www/html:ro - ./runtime:/var/www/html/runtime:rw(只读代码 + 可写 runtime) - 别用
-v ./app:/var/www/html整目录挂载,否则权限冲突无法避免
Nginx 要把请求正确甩给 index.php
去掉 index.php 就 404?不是 ThinkPHP 设置问题,是 Nginx 没把 URL 路由传过去。Nginx 容器配置必须包含这几点:
-
root指向/var/www/html/public(不是项目根目录) -
location /用try_files $uri $uri/ /index.php?$query_string;($query_string保证 ?s=xxx 参数不丢) -
location ~ \.php$块里必须有:fastcgi_pass php:9000;(php 是你的 PHP-FPM 服务名)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;(不能写死路径,也不能用变量拼错)
依赖装全,vendor 别靠启动时补
报 Class 'think\App' not found?说明 vendor/autoload.php 根本没加载——因为 vendor 目录是空的。
- Dockerfile 里先 COPY
composer.json和composer.lock - 再 RUN
composer install --no-dev --optimize-autoloader - 最后才 COPY . .(避免代码改一次,整个 vendor 重装)
- 确认
public/index.php含有require __DIR__.'/../vendor/autoload.php';
不复杂,但每一步都得踩准。漏掉 fastcgi_param 或挂错 runtime,都会卡在第一步。



















