核心是用Docker Compose编排Nginx、PHP-FPM、MySQL三服务协同工作,并通过卷(Volume)持久化代码、数据库及日志;需先确保Windows系统满足WSL2与Docker Desktop运行条件,再定制PHP镜像支持ThinkPHP所需扩展(如Swoole、PDO)。

在 Windows 上用 Docker Desktop 搭建 ThinkPHP 环境,核心不是单个容器跑起来,而是让 Nginx、PHP-FPM、MySQL 各司其职又协同工作——这靠 Docker Compose 编排;同时确保代码、数据库、日志不随容器销毁而丢失——这靠 卷(Volume)持久化。两者结合,才是可开发、可调试、可交付的生产级环境。
一、基础环境必须到位
别跳过检查,90% 的启动失败源于前置条件未满足:
- 系统为 Windows 10 22H2(Build 19045+)或 Windows 11,64 位
- CPU 虚拟化已开启(任务管理器 → 性能 → 虚拟化:已启用)
- 已安装并启用 WSL2(PowerShell 管理员运行:
wsl --install,重启后执行wsl -l -v确认版本为 2) - Docker Desktop 已安装,启动后右下角托盘图标显示“Docker Desktop is running”
二、用 Docker Compose 编排三件套服务
在项目根目录(如 E:\docker-thinkphp)新建 docker-compose.yml,内容如下:
version: '3.8' <p>services: nginx: image: nginx:alpine ports:</p><ul><li>"80:80" volumes:</li><li>./app:/var/www/html</li><li>./nginx/conf.d:/etc/nginx/conf.d depends_on:</li><li>php</li></ul><p>php: build: context: ./php dockerfile: Dockerfile volumes:</p><ul><li>./app:/var/www/html</li><li>./php/conf.d:/usr/local/etc/php/conf.d environment:</li><li>TZ=Asia/Shanghai</li></ul><p>mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: thinkphp MYSQL_USER: tpuser MYSQL_PASSWORD: tppass volumes:</p><ul><li>mysql-data:/var/lib/mysql ports:</li><li>"3306:3306"</li></ul><p>volumes: mysql-data:
说明:
立即学习“PHP免费学习笔记(深入)”;
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
-
nginx使用官方 Alpine 镜像,轻量且安全;通过挂载自定义 Nginx 配置实现 PHP 请求转发(需准备./nginx/conf.d/default.conf) -
php不直接拉取镜像,而是基于本地./php/Dockerfile构建,便于安装 Swoole、PDO、Redis 等 ThinkPHP 所需扩展 -
mysql的数据目录/var/lib/mysql映射到命名卷mysql-data,彻底避免容器删除导致库丢失
三、定制 PHP 镜像支持 ThinkPHP + Swoole
在 ./php/ 目录下创建 Dockerfile:
FROM php:8.1-fpm-alpine <h1>安装基础依赖与扩展</h1><p>RUN apk add --no-cache \ $PHPIZE_DEPS \ icu-dev \ zlib-dev \ libpng-dev \ freetype-dev \ jpeg-dev \ g++ \ make \ autoconf \ automake \ file \ git && \ docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \ docker-php-ext-install -j$(nproc) gd pdo_mysql opcache intl zip && \ pecl install swoole && \ docker-php-ext-enable swoole</p><h1>复制自定义 php.ini(可选)</h1><p>COPY php.ini /usr/local/etc/php/php.ini</p><h1>设置时区与工作目录</h1><p>ENV TZ=Asia/Shanghai WORKDIR /var/www/html</p><h1>暴露端口(FPM 默认监听 9000)</h1><p>EXPOSE 9000
关键点:
- 使用
alpine基础镜像减小体积,但注意部分扩展需适配 Alpine 的包管理(apk) -
pecl install swoole后必须执行docker-php-ext-enable swoole启用扩展 - ThinkPHP 8.1+ 推荐 PHP 8.1+,若用 TP6 则可降级为
php:7.4-fpm-alpine并调整扩展版本
四、持久化不只是数据库
真正健壮的环境要持久化三类内容:
-
代码:通过
./app:/var/www/html双向挂载,本地改代码,容器内实时生效 -
数据库:用命名卷
mysql-data存储 MySQL 数据文件,删容器不丢库 -
日志与配置:Nginx 错误日志、PHP-FPM 日志建议挂载到宿主机(如
./logs/nginx:/var/log/nginx),方便排查;PHP 配置通过挂载./php/conf.d/实现热更新
启动命令只需一条:docker-compose up -d。之后访问 http://localhost 即可看到 ThinkPHP 默认页,数据库连接信息在 .env 中设为 mysql:host=mysql;port=3306;dbname=thinkphp。


















