核心是用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>
- "80:80" volumes:
- ./app:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d depends_on:
- php
php: build: context: ./php dockerfile: Dockerfile volumes:
- ./app:/var/www/html
- ./php/conf.d:/usr/local/etc/php/conf.d environment:
- TZ=Asia/Shanghai
mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: thinkphp MYSQL_USER: tpuser MYSQL_PASSWORD: tppass volumes:
- mysql-data:/var/lib/mysql ports:
- "3306:3306"
volumes: mysql-data:
说明:
-
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</p>
关键点:
- 使用
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。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











