Docker容器化搭建ThinkPHP运行环境:一键部署与迁移指南【教程】
Docker容器化部署ThinkPHP需处理三项核心配置:runtime目录权限对齐、Nginx正确传递PATH_INFO、依赖分层构建。通过构建时授权、指定运行用户、挂载只读代码目录可解决权限问题;配置fastcgi_split_path_info与PATH_INFO参数支持路由;采用composer分层安装并禁用dev包以精简镜像。
ThinkPHP 容器化部署,简单说说关键——三件事:runtime目录权限对齐、Nginx正确传递PATH_INFO、依赖分层构建不冗余。把这几处理顺了,基本就能做到本地写代码、打包即上线、换服务器一键迁移。

runtime 和 storage 目录权限必须提前设好
容器启动后报 file_put_contents(/runtime/) 权限拒绝,十有八九是宿主机用户与容器内 www-data 用户的 UID 不一致,或者挂载方式过于随意。解决起来其实不复杂:
- 构建镜像时就创建好目录并授权:
RUN mkdir -p /var/www/runtime /var/www/storage && chown -R www-data:www-data /var/www/runtime /var/www/storage - 运行容器时显式指定用户身份:
docker run -u www-data ...,避免 PHP 进程以 root 身份写 runtime 目录 - 挂载目录别图省事:
-v ./app:/var/www:ro(代码只读)配合-v ./runtime:/var/www/runtime(目录单独可写),既安全又可控 - 检查 php-fpm 配置中的
user = www-data和group = www-data是否与容器内实际用户完全匹配
Nginx 配置要支持 ThinkPHP 的路由规则
默认 Nginx 配置下,Route::rule() 失效、所有请求落到首页或返回 404——问题出在 PATH_INFO 没传过去。关键配置必须到位:
- location 块中必须包含这两行:
fastcgi_split_path_info ^(.+.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME务必使用绝对路径,例如/var/www/public/index.php,尽量避免用变量拼接- 推荐使用
try_files $uri $uri/ /index.php?$query_string;替代旧式 rewrite 规则,更简洁稳定
Dockerfile 分层构建,生产环境精简依赖
镜像体积大、构建慢、线上行为异常,通常是因为 composer install 没有控制好构建阶段和参数。经验证实的做法是:先复制 composer.json 和 composer.lock,再执行 RUN composer install --no-dev --optimize-autoloader,然后才 COPY . .。这样代码变更不会触发整包重装。
禁用 dev 包(--no-dev)能去掉 phpunit、faker 等非运行时依赖,显著减小镜像体积并提升安全性。另外,务必确认 vendor/bin/think 具有可执行权限——某些基础镜像需要额外 RUN chmod +x vendor/bin/think。
用 docker-compose 编排,让数据库、缓存、Web 服务联动起来
单容器能跑通,但真实项目离不开 MySQL、Redis、Nginx 的协同工作。Docker Compose 就是把这些服务串联起来的“指挥官”:
- web 服务使用自定义 Dockerfile 构建,同时挂载代码(只读)和 runtime(可写)
- db 服务选用
mysql:8.0或mysql:5.7,通过 environment 设置MYSQL_ROOT_PASSWORD和MYSQL_DATABASE - 用
depends_on保证数据库优先启动;使用自定义 network 让服务间可通过服务名通信(例如 PHP 连接 mysql://db:3306) - 敏感配置(如数据库密码)不要写死在代码里,改为通过
environment字段传入,配合 ThinkPHP 的 env 支持自动加载
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















