告别‘我本地是好的’:用Docker Compose一键部署ThinkPHP 8.1 + Nginx + MySQL开发环境

告别‘我本地是好的’:用Docker Compose一键部署ThinkPHP 8.1 + Nginx + MySQL开发环境 告别‘我本地是好的’用Docker Compose一键部署ThinkPHP 8.1 Nginx MySQL开发环境这代码在我电脑上跑得好好的——这句话可能是开发团队协作中最令人头疼的辩解之一。环境差异导致的Bug不仅浪费大量调试时间更会拖慢整个项目的交付进度。本文将带你用Docker Compose构建一套标准化的ThinkPHP 8.1开发环境让团队每个成员都能在5分钟内获得完全一致的开发环境。1. 为什么需要Docker化开发环境在传统开发模式中新成员加入团队往往需要经历繁琐的环境配置过程PHP版本不一致有人用7.4有人用8.1MySQL配置参数差异字符集、排序规则等Nginx/Apache重写规则配置不统一扩展依赖缺失如缺少pdo_mysql扩展这些问题会导致在我机器上能运行的经典问题。Docker Compose通过声明式配置解决这些问题version: 3 services: php: image: php:8.1-fpm volumes: - ./:/var/www/html nginx: image: nginx:latest ports: - 8080:80 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret提示上述配置已经包含了PHP 8.1、Nginx和MySQL 8.0三个核心服务的基础定义2. 完整环境搭建实战2.1 项目初始化与目录结构首先创建项目基础目录结构thinkphp-docker/ ├── docker-compose.yml # 容器编排配置 ├── nginx/ # Nginx配置目录 │ └── thinkphp.conf # 站点专用配置 └── app/ # ThinkPHP项目代码使用Composer创建ThinkPHP项目docker run --rm -v $(pwd)/app:/app composer create-project topthink/think:8.1.* .2.2 编写docker-compose.yml完整的docker-compose.yml配置如下version: 3.8 services: php: image: php:8.1-fpm volumes: - ./app:/var/www/html working_dir: /var/www/html depends_on: - mysql networks: - app-network nginx: image: nginx:1.23-alpine ports: - 8080:80 volumes: - ./app:/var/www/html - ./nginx/thinkphp.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: thinkphp MYSQL_USER: thinkphp MYSQL_PASSWORD: secret volumes: - mysql-data:/var/lib/mysql ports: - 3306:3306 networks: - app-network volumes: mysql-data: networks: app-network: driver: bridge关键配置说明网络配置创建专用网络(app-network)确保容器间通信隔离数据卷mysql-data卷确保数据库持久化环境变量MySQL预创建了thinkphp数据库和用户2.3 Nginx配置优化nginx/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; } location ~ /\.(?!well-known).* { deny all; } }3. 高级配置技巧3.1 PHP扩展安装ThinkPHP 8.1需要以下PHP扩展pdo_mysqlmbstringopenssljson通过Dockerfile自定义PHP镜像FROM php:8.1-fpm RUN docker-php-ext-install pdo_mysql mbstring openssl \ pecl install redis \ docker-php-ext-enable redis然后在docker-compose.yml中修改php服务php: build: . image: custom-php:8.13.2 多环境配置管理使用环境变量文件管理不同环境的配置.env文件APP_ENVdevelopment DB_HOSTmysql DB_NAMEthinkphp DB_USERthinkphp DB_PASSsecret修改docker-compose.yml的php服务php: env_file: - .env3.3 Xdebug配置开发环境下可以启用XdebugFROM php:8.1-fpm RUN pecl install xdebug \ docker-php-ext-enable xdebug添加xdebug.ini配置zend_extensionxdebug.so xdebug.modedevelop,debug xdebug.client_hosthost.docker.internal xdebug.start_with_requestyes4. 团队协作实践4.1 版本控制集成将以下内容添加到.gitignore/app/runtime/* !/app/runtime/.gitkeep /vendor/ .env docker-compose.override.yml4.2 新成员快速上手团队新成员只需三步即可启动开发环境克隆代码仓库复制.env.example为.env运行命令docker-compose up -d4.3 CI/CD集成示例.gitlab-ci.yml示例stages: - test phpunit: stage: test image: custom-php:8.1 services: - name: mysql:8.0 alias: mysql variables: DB_HOST: mysql DB_NAME: thinkphp_test DB_USER: root DB_PASS: rootpass script: - cd app - composer install - php think unit这套标准化环境配置不仅解决了在我机器上能运行的问题还为团队带来了额外收益新成员入职配置时间从2小时缩短到5分钟测试环境与开发环境完全一致减少环境相关Bug可以轻松创建隔离的测试环境进行并行开发