当前位置: 首页 > news >正文

从零到一:基于Docker Compose构建ThinkPHP 8.1微服务化开发栈

1. 为什么选择Docker Compose搭建ThinkPHP开发环境

每次接手新项目时,最头疼的就是搭建开发环境。记得去年团队来了个新人,光是配环境就折腾了三天,不是PHP版本不对就是MySQL连接不上。这种经历让我下定决心要把开发环境标准化,而Docker Compose就是解决这个痛点的最佳方案。

用Docker Compose管理ThinkPHP环境有几个明显优势:

  • 环境隔离:每个服务运行在独立容器中,不会污染宿主机环境
  • 一键启动:只需一个命令就能拉起整个服务栈
  • 版本可控:可以精确指定PHP、MySQL等组件的版本
  • 团队协作:docker-compose.yml文件纳入版本控制,全团队使用相同环境

我特别喜欢Docker Compose的依赖管理功能。比如配置里写明Nginx依赖PHP服务,启动时会自动按正确顺序启动容器,再也不用担心服务启动顺序的问题了。

2. 从零开始搭建基础环境

2.1 安装必备工具

在开始之前,我们需要确保系统已经安装了Docker和Docker Compose。打开终端执行以下命令检查版本:

docker --version docker-compose --version

如果还没安装,可以参考官方文档进行安装。我建议使用Docker Desktop,它自带了Docker Compose,特别适合新手。安装完成后记得把Docker服务跑起来,这个小细节经常被忽略。

2.2 创建项目目录结构

好的目录结构能让后续维护更轻松。我习惯这样组织代码:

thinkphp-docker/ ├── docker-compose.yml ├── nginx/ │ └── conf.d/ │ └── thinkphp.conf └── app/ └── (ThinkPHP项目代码)

用mkdir命令创建这些目录:

mkdir -p thinkphp-docker/{nginx/conf.d,app}

这种结构把Nginx配置和项目代码分开存放,后期要修改配置时一目了然。

3. 编写Docker Compose配置文件

3.1 定义基础服务

docker-compose.yml是整个环境的核心,我们先从最基础的三个服务开始:

version: '3.8' services: php: image: php:8.1-fpm volumes: - ./app:/var/www/html networks: - app-network nginx: image: nginx:alpine ports: - "8080:80" volumes: - ./app:/var/www/html - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - php networks: - app-network mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: thinkphp volumes: - mysql-data:/var/lib/mysql networks: - app-network volumes: mysql-data: networks: app-network: driver: bridge

这个配置有几个关键点:

  • 使用PHP 8.1的fpm镜像
  • Nginx使用轻量级的alpine版本
  • MySQL 8.0配置了默认数据库和root密码
  • 所有服务共享同一个自定义网络

3.2 优化PHP容器配置

基础PHP镜像缺少一些ThinkPHP必需的扩展,我们需要通过Dockerfile来定制:

FROM php:8.1-fpm RUN apt-get update && \ apt-get install -y \ libzip-dev \ zip \ unzip RUN docker-php-ext-install pdo_mysql mbstring zip

然后在docker-compose.yml中修改php服务:

php: build: . volumes: - ./app:/var/www/html

这样构建时会自动安装所需扩展。建议把这些常用扩展一次性装好,避免后期反复折腾。

4. 配置Nginx支持ThinkPHP

4.1 编写Nginx配置文件

在nginx/conf.d目录下创建thinkphp.conf:

server { listen 80; server_name localhost; root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } }

这个配置有几个注意点:

  • root要指向public目录
  • 路由重写要兼容ThinkPHP的路由规则
  • fastcgi_pass指向php服务的9000端口

4.2 测试Nginx配置

启动前可以先验证配置是否正确:

docker-compose run --rm nginx nginx -t

如果看到"configuration file /etc/nginx/nginx.conf test is successful"就说明配置没问题。

5. 初始化ThinkPHP项目

5.1 创建ThinkPHP项目

在项目目录下执行:

docker-compose run --rm php composer create-project topthink/think app

这个命令会:

  1. 启动一个临时PHP容器
  2. 使用composer安装ThinkPHP
  3. 完成后自动删除容器

5.2 配置数据库连接

修改app/config/database.php:

return [ 'default' => 'mysql', 'connections' => [ 'mysql' => [ 'type' => 'mysql', 'hostname' => 'mysql', 'database' => 'thinkphp', 'username' => 'root', 'password' => 'secret', 'hostport' => '3306', 'charset' => 'utf8mb4', ], ], ];

关键点是hostname要写mysql服务的名称,这是Docker Compose提供的服务发现功能。

6. 启动与调试

6.1 一键启动服务

现在可以启动所有服务了:

docker-compose up -d

启动后可以通过以下命令检查状态:

docker-compose ps

如果所有服务状态都是"Up"就说明启动成功了。

6.2 常见问题排查

如果遇到问题,可以查看日志:

docker-compose logs nginx docker-compose logs php docker-compose logs mysql

我遇到过几个典型问题:

  1. Nginx报502错误:通常是PHP服务没启动或端口不对
  2. 数据库连接失败:检查database.php配置和MySQL容器日志
  3. 文件权限问题:确保app目录有足够权限

7. 开发环境优化技巧

7.1 使用Xdebug调试

在Dockerfile中添加:

RUN pecl install xdebug && \ docker-php-ext-enable xdebug

然后配置php.ini:

[xdebug] xdebug.mode=debug xdebug.client_host=host.docker.internal xdebug.start_with_request=yes

这样就能在IDE中设置断点调试了。

7.2 热重载配置

修改docker-compose.yml,添加文件监视:

services: php: volumes: - ./app:/var/www/html - ./php/conf.d:/usr/local/etc/php/conf.d

这样修改PHP配置后只需重启容器就能生效,不用重建镜像。

7.3 使用Redis缓存

添加redis服务:

redis: image: redis:alpine networks: - app-network

然后在ThinkPHP中配置cache.php使用Redis,能显著提升性能。

http://www.jsqmd.com/news/575288/

相关文章:

  • 算力驱动智慧零售|腾视科技AI边缘算力盒子 —— 无人商超全场景解决方案重磅发布
  • 别再用if-else了!用状态机重构你的51单片机红外循迹小车代码(思路+代码对比)
  • 别再当‘黑盒’玩家了!用Grad-CAM给你的YOLOv5模型做个‘X光’检查(附完整代码)
  • HoRain云--RESTful API设计核心
  • 发动机阀系系统设计避坑指南:AVL-Excite中这10个元素配置最容易出错
  • 3个突破式步骤:APK-Installer让跨平台应用安装不再复杂
  • 解密Godot引擎资源提取:PCK文件探秘与实战指南
  • 微信小程序uView实战:u-picker三级联动避坑指南(附完整代码)
  • 【nacos】2.4.2版本安全升级实战:从漏洞修复到鉴权配置
  • 拼多多AI标题优化实战:从百度指数到智能生成,三步打造爆款标题
  • 3步打造华硕笔记本终极控制中心:GHelper轻量级工具深度应用指南
  • Android购物商城APP实战:从零到一构建核心功能模块
  • Nanbeige 4.1-3B Streamlit WebUI部署教程:CI/CD自动化部署流水线设计
  • 好写作AI|避免“AI味”过重:硕士初稿中的人机协同写作技巧
  • WebPlotDigitizer革新性图像数字化全链路解决方案:从像素到数据的智能转化指南
  • 5个实战技巧:网络性能诊断完全指南
  • OpenClaw数据安全方案:Qwen3.5-9B私有化处理敏感文档
  • 2026年4月最新江诗丹顿官方售后服务中心网点考察报告(新址) - 速递信息
  • AI专著生成新玩法!掌握这些工具,快速产出高质量专业专著
  • IM1281B电量计模块避坑指南:从接线到数据解析的全流程实战
  • AI专著生成新玩法!揭秘爆款专著背后的AI写作工具
  • 天虹购物卡回收方法分享:回收注意事项及常见问题解答 - 团团收购物卡回收
  • 技术深度解析:logitech-pubg项目实现PUBG后坐力控制的Lua脚本架构设计
  • AI 编程助手的幻觉问题:如何用 OpenSpec 实现规范驱动开发
  • 猫抓扩展全方位解析:从问题诊断到深度优化的终极指南
  • 千问3.5-2B图文理解入门指南:无需Python基础,网页交互式视觉AI初体验
  • ENVI实战:利用传感器波谱响应函数实现光谱曲线精准重采样
  • ADS工程化实践:AEL自定义函数库的创建与集成
  • FPGA开发选型实战:以Microchip Libero为例,聊聊LVCMOS和LVTTL到底该怎么选?
  • DLSS Swapper技术解析:3层架构实现游戏性能优化自动化