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

张开发
2026/4/13 6:55:50 15 分钟阅读

分享文章

从零到一:基于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支持ThinkPHP4.1 编写Nginx配置文件在nginx/conf.d目录下创建thinkphp.confserver { 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这个命令会启动一个临时PHP容器使用composer安装ThinkPHP完成后自动删除容器5.2 配置数据库连接修改app/config/database.phpreturn [ 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我遇到过几个典型问题Nginx报502错误通常是PHP服务没启动或端口不对数据库连接失败检查database.php配置和MySQL容器日志文件权限问题确保app目录有足够权限7. 开发环境优化技巧7.1 使用Xdebug调试在Dockerfile中添加RUN pecl install xdebug \ docker-php-ext-enable xdebug然后配置php.ini[xdebug] xdebug.modedebug xdebug.client_hosthost.docker.internal xdebug.start_with_requestyes这样就能在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能显著提升性能。

更多文章