学以致用——用Docker搭建ThinkPHP开发环境
在前几篇文档中,我们已经系统学习了 Docker 的核心概念(如容器、镜像、Docker 引擎等),并通过hello-world容器完成了第一次实战操作。当基础认知与入门实践相结合后,接下来我们可以尝试更贴近实际开发的场景 —— 利用 Docker 搭建 ThinkPHP 8.1 开发环境。
一、核心准备工作
(一)验证 Docker 环境
确保 Docker 已正确安装并运行,在 PowerShell 或命令提示符(CMD) 中执行以下命令验证:
docker --version # 查看Docker版本
docker-compose --version # 查看Docker Compose版本
若如下图返回版本信息,说明环境就绪。
二、搭建步骤详解
(一)创建项目目录及 ThinkPHP 8.1 项目
首先创建项目根目录并在其中生成 ThinkPHP 8.1 项目,步骤如下:
1、创建项目根目录:
在 Windows 中选择一个目录(如 E:\docker_dev\thinkphp-docker),作为项目根目录。
2、创建 ThinkPHP 8.1 项目
方式一:通过 Docker Composer 镜像直接创建(无需进入容器):
docker run --rm -v "${PWD}:/app" composer create-project topthink/think:8.1.* myweb
# 若使用CMD,将${PWD}替换为%cd%
# docker run --rm -v "%cd%:/app" composer create-project topthink/think:8.1.* myweb
命令解析:--rm表示容器运行后自动删除;-v "${PWD}:/app"(PowerShell)或-v "%cd%:/app"(CMD)将当前目录挂载到容器的/app目录;composer是官方镜像,直接创建项目到myweb目录。
方式二:本地创建(需本地安装 Composer):
composer create-project topthink/think:8.1.* myweb
方式三:容器内创建(无需本地安装 Composer):
# 临时启动PHP容器并进入(PowerShell命令)
docker run --rm -it -v "${PWD}:/app" php:8.1-fpm /bin/bash# 若使用CMD,将${PWD}替换为%cd%
# docker run --rm -it -v "%cd%:/app" php:8.1-fpm /bin/bash# 在容器内安装Composer
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# 进入挂载目录并创建项目
cd /app && composer create-project topthink/think:8.1.* myweb# 退出容器
exit
此时项目目录结构已自动生成:
thinkphp-docker/
└── myweb/ # 已创建的ThinkPHP 8.1项目代码目录
(二)编写 Docker Compose 配置
在项目根目录(thinkphp-docker)创建docker-compose.yml,内容如下(Windows 环境无需修改路径格式,Docker 会自动适配):
version: '3'
services:php:image: php:8.1-fpmvolumes:- ./myweb:/var/www/html # 挂载本地项目到容器depends_on:- mysql # 依赖mysql服务,确保先启动数据库nginx:image: nginx:latestports:- "80:80" # 端口映射:宿主机80端口→容器80端口volumes:- ./myweb:/var/www/html # 共享项目目录- ./nginx.conf:/etc/nginx/conf.d/thinkphp.conf # 挂载Nginx配置depends_on:- php # 依赖php服务mysql:image: mysql:8.0ports:- "3306:3306" # 映射数据库端口environment:MYSQL_ROOT_PASSWORD: root # 数据库root密码MYSQL_DATABASE: thinkphp # 自动创建的数据库名MYSQL_CHARACTER_SET_SERVER: utf8mb4MYSQL_COLLATION_SERVER: utf8mb4_unicode_civolumes:- mysql_data:/var/lib/mysql # 数据卷持久化存储数据volumes:mysql_data: # 定义数据卷,防止容器删除丢失数据
关键配置解释:
- Windows 中./myweb等路径会被 Docker 自动转换为容器可识别的格式,无需手动修改为\
- mysql_data数据卷:在 Windows 上同样能确保数据持久化,不受容器删除影响
(三)配置 Nginx 服务
在项目根目录(thinkphp-docker)创建nginx.conf,内容如下:
server {listen 80;server_name localhost;root /var/www/html/public; # ThinkPHP 8.1入口目录(必须指向public)index index.php index.html;# URL重写支持(ThinkPHP的PATH_INFO模式)location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;}}# PHP脚本解析location ~ \.php$ {fastcgi_pass php:9000; # 连接php容器的9000端口fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
此时项目完整目录结构为:
thinkphp-docker/
├── docker-compose.yml # 容器编排配置
├── nginx.conf # Nginx站点配置
└── myweb/ # ThinkPHP 8.1项目代码目录
(四)启动容器集群
在项目根目录执行以下命令启动所有服务:
docker-compose up -d # -d参数表示后台运行
执行该命令时,Docker 会自动检查本地是否存在所需镜像,若不存在则自动从 Docker Hub 拉取,只需等待拉取完成即可。
如果本地不存在所需的镜像就需要多等待一会,具体如下图:
成功后的页面:
查看容器状态:
docker-compose ps # 显示所有服务的运行状态
- 状态为Up表示启动成功
- 若出现Exit状态,可通过docker-compose logs [服务名]查看错误日志
(五)安装 PHP 必要扩展
ThinkPHP 8.1 运行依赖pdo_mysql、mbstring等扩展,需进入 PHP 容器安装(Windows 终端操作):
# 查看PHP容器名称(PowerShell/CMD通用)
docker ps --format "{{.Names}}" | findstr "php"# 示例输出:thinkphp-docker_php_1# 进入php容器(替换[容器名]为实际名称)
docker exec -it [容器名] /bin/bash# 若提示bash: not found,改用sh
# docker exec -it [容器名] /bin/sh# 安装扩展
docker-php-ext-install pdo_mysql mbstring# 退出容器
exit# 重启php容器使扩展生效
docker restart [容器名]
(六)环境测试与配置调整
1、在浏览器访问http://localhost,出现 ThinkPHP 8.1 欢迎页即表示环境搭建成功(我是修改过端口号的,所以我的地址是http://localhost:8080)
2、修改数据库配置(myweb/config/database.php):
return ['type' => 'mysql','hostname' => 'mysql', # 数据库主机名填容器名'database' => 'thinkphp','username' => 'root','password' => 'root','hostport' => '3306','charset' => 'utf8mb4', # 与MySQL字符集保持一致
];
数据库主机名使用mysql(容器名),利用 Docker 内部网络通信
数据库主机名docker-compose.yml
的 services
下给 MySQL 服务起的名字
三、Windows 环境注意事项
1、路径与终端差异:
- PowerShell 中使用${PWD}表示当前目录,CMD 中使用%cd%
- 避免在路径中使用中文或空格,可能导致挂载失败
- 推荐使用 PowerShell(管理员模式)执行命令,兼容性更好
2、端口冲突:
ports:
- "8080:80" # 宿主机8080端口映射到容器80端口
若 80 或 3306 端口被占用(如 IIS、其他数据库),需修改docker-compose.yml中的端口映射,例如:
3、权限问题:
- Windows 系统无需执行chmod命令,文件权限由系统自动管理
- 若出现权限错误,右键项目目录→“属性”→“安全”,确保当前用户有读写权限
通过以上适配 Windows 系统的步骤,可快速搭建标准化的 ThinkPHP 8.1 开发环境,有效解决多环境一致性问题。熟练掌握后,可根据实际需求扩展更多服务。
参考文章:
Docker 初学者需要了解的几个知识点 (五):建容器需要进一步了解的概念(1)-CSDN博客
Docker 初学者需要了解的几个知识点 (六):docker-compose.yml (ThinkPHP)-CSDN博客
Docker 初学者需要了解的几个知识点 (七):php.ini -CSDN博客