直接给出结论:使用官方 php:8.4-apache 镜像,仅需一行命令即可启动,无需编写 Dockerfile 或 compose 文件,5 秒内完成部署——这是截至 2026 年中运行 ThinkPHP 8.0 最简洁、最高效的方案。接下来直接进入实操,关键细节与常见陷阱一次性讲清楚。
直接使用官方 php:8.4-apache 镜像一行命令启动 ThinkPHP 8.0 是当前最简方案:docker run -d --name tp8-web -p 8080:80 -v $(pwd):/var/www/html -e TZ=Asia/Shanghai -e PHP_MEMORY_LIMIT=512M -e OPCACHE_ENABLE=1 php:8.4-apache,但需补充 storage/runtime 目录权限及 DB_HOST 配置。

基础命令一键启动(开发环境快速验证)
确保已安装 Docker,并在 ThinkPHP 8.0 项目根目录执行以下命令(也可将其写入 start.sh 脚本,后续直接运行):
docker run -d --name tp8-web -p 8080:80 -v $(pwd):/var/www/html -e TZ=Asia/Shanghai -e PHP_MEMORY_LIMIT=512M -e OPCACHE_ENABLE=1 php:8.4-apache
这条命令的核心作用拆解如下:
php:8.4-apache镜像已预装 ThinkPHP 8.0 运行所需的pdo_mysql、mbstring、openssl、gd、opcache等扩展,无需额外安装。-v $(pwd):/var/www/html将当前目录挂载至容器内 Web 根目录,修改代码后即时生效。Mac/Linux 环境下建议追加:cached以提升性能。-e TZ=Asia/Shanghai显式设置时区,否则日志时间错乱、缓存失效等问题会频繁出现。- 启动后访问
https://localhost:8080即可看到 ThinkPHP 默认欢迎页,无需任何额外配置。
必须补全的两处配置(否则 90% 会报错)
许多人在启动后卡在「无法写入 runtime」或「数据库连接失败」,根源在于以下两个关键点未显式处理。
- storage 和 runtime 目录权限:容器内 Apache 进程以
www-data(UID 33)运行,但宿主机目录默认属主并非该用户。执行sudo chown -R 33:33 storage runtime即可解决。 - 数据库连接地址:ThinkPHP 的
.env中若写DB_HOST=mysql,单容器模式下无法解析该服务。正确做法:Windows/macOS 下改为DB_HOST=host.docker.internal,Linux 下改为DB_HOST=172.17.0.1(Docker 默认网关地址)。
进阶:添加 MySQL 容器(仍保持极简)
如需本地连接数据库,又不想编写 docker-compose.yml,两行命令即可搞定:
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=Root@2026 -e MYSQL_DATABASE=tp8 -v mysql8-data:/var/lib/mysql -p 3307:3306 --restart unless-stopped mysql:8 docker run -d --name tp8-web -p 8080:80 --link mysql8:mysql -v $(pwd):/var/www/html -e TZ=Asia/Shanghai php:8.4-apache
⚠️ 注意:--link 虽属旧式用法,但对单机开发而言足够轻量,且无需额外网络配置。此时 .env 中可安全写入 DB_HOST=mysql,容器间通过 link 自动解析。
避坑提醒(2026 实测高频问题)
- 别用 php:alpine 镜像:Alpine 默认缺少
libpng/libjpeg,ThinkPHP 的图形验证码、图片缩略图功能会直接报错。建议使用php:8.4-apache(基于 Debian),更稳定可靠。 - 警惕“PHP 8.5.7”镜像:截至 2026 年 7 月,PHP 官方最新稳定版为 8.4.x,8.5 尚未发布。任何标注 8.5.7 的镜像均不可信。
- 不要忽略 .dockerignore:至少将
vendor/、node_modules/、.git/加入忽略列表,否则大文件会拖慢构建和挂载过程。 - 避免在 CLI 模式查看 phpinfo():Apache 模块加载的扩展并不等同于 CLI 加载的扩展。验证扩展是否生效,请使用
docker exec tp8-web php -m | grep pdo_mysql。
