这是一个基于 Docker 的 PHP 开发环境(DNMP: Docker + Nginx + MySQL + PHP),遵循 "精简原则",尽量最小定制化,将定制工作交给使用者。通过简单的配置,提供灵活的开发环境。
- ✅ 简单易用:开箱即用,配置清晰
- ✅ 现代化:兼容最新 Docker Compose 格式
- ✅ 灵活配置:通过环境变量轻松调整版本和端口
- ✅ 性能优化:使用缓存挂载,提升开发体验
- ✅ 多版本支持:支持 PHP 7.2+、MySQL 5.7/8.0、Redis 等
. ├── .env # 环境变量配置文件(需要从 env.example 复制) ├── env.example # 环境变量配置示例文件 ├── Dockerfile # PHP 镜像构建脚本 ├── docker-compose.yml # Docker Compose 配置文件 ├── config/ │ ├── nginx/ # Nginx 配置目录 │ │ └── conf.d/ # 站点配置文件(在此添加新项目配置) │ ├── php/ # PHP 配置文件 │ │ ├── php72.ini # PHP 7.2 配置 │ │ └── php73.ini # PHP 7.3 配置 │ └── redis.conf # Redis 配置文件 ├── data/ # 数据持久化目录 │ ├── composer/ # Composer 缓存 │ ├── mysql/ # MySQL 数据 │ └── redis/ # Redis 数据 ├── logs/ # 日志目录 │ └── nginx/ # Nginx 日志 └── resources/ # PHP 扩展源码包 ├── redis-5.1.1.tgz ├── mongodb-1.6.0.tgz ├── xdebug-3.0.1.tgz └── ... - PHP 7.2+ (FPM) - 支持多版本
- Nginx (Alpine) - Web 服务器
- MySQL 8.0 - 数据库
- Redis 7 - 缓存/会话存储
- RabbitMQ - 消息队列(可选)
- SFTP - 文件传输服务(可选)
- Docker Desktop 或 Docker Engine 20.10+
- Docker Compose 2.0+
# 复制环境变量示例文件 cp env.example .env # 编辑 .env 文件,根据实际情况修改配置 # 主要配置项: # - WEB_ROOT: 项目根目录路径 # - PHP_VERSION: PHP 版本 # - MYSQL_ROOT_PASSWORD: MySQL root 密码 # - 各服务端口配置建议将 DNMP 项目放在与其他开发项目的平级目录:
projects/ ├── laravel/ # Laravel 项目 ├── symfony/ # Symfony 项目 └── dnmp/ # 本环境(DNMP) # 进入 dnmp 目录 cd dnmp # 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps # 查看日志 docker compose logs -f在 config/nginx/conf.d/ 目录下添加站点配置文件,参考 larave.conf 示例。
# 重启所有服务 docker compose restart # 重启单个服务(如 nginx) docker compose restart nginx # 重新构建 PHP 镜像 docker compose build php72在宿主机 /etc/hosts 文件中添加:
127.0.0.1 laravel.test 127.0.0.1 api.test 或者使用 dnsmasq(见附录)。
在项目配置文件中使用容器名称作为主机名:
# Laravel .env 示例 DB_CONNECTION=mysql DB_HOST=mysql # 使用容器名,不是 127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret REDIS_HOST=redis # 使用容器名 REDIS_PORT=6379 REDIS_PASSWORD=null在 docker-compose.yml 中取消注释 php73 服务,然后:
# 启动 PHP 7.3 服务 docker compose up -d php73 # 在 Nginx 配置中修改 fastcgi_pass # fastcgi_pass php73:9000;# 进入 PHP 容器 docker compose exec php72 bash # 在容器内执行 PHP 命令 docker compose exec php72 php -v docker compose exec php72 composer install # 在容器内执行 Composer docker compose exec php72 composer require package/name扩展已预装在 Dockerfile 中,如需添加新扩展:
- 将扩展源码包放入
resources/目录 - 修改
Dockerfile添加安装步骤 - 重新构建镜像:
docker compose build php72
查看已安装扩展:
docker compose exec php72 php -m# 查看所有服务日志 docker compose logs # 查看特定服务日志 docker compose logs nginx docker compose logs php72 docker compose logs mysql # 实时跟踪日志 docker compose logs -f nginx# 备份 MySQL 数据 docker compose exec mysql mysqldump -u root -p --all-databases > backup.sql # 备份 Redis 数据 docker compose exec redis redis-cli SAVE cp data/redis/dump.rdb backup/使用 dnsmasq 可以自动将所有 .test 域名解析到本地:
# 1. 安装 dnsmasq brew install dnsmasq # 2. 检查 Homebrew 安装路径(Apple Silicon 使用 /opt/homebrew) # Intel Mac: /usr/local/etc/dnsmasq.conf # Apple Silicon: /opt/homebrew/etc/dnsmasq.conf # 3. 配置 dnsmasq(根据实际情况选择路径) # Apple Silicon (M芯片) echo 'address=/.test/127.0.0.1' | sudo tee -a /opt/homebrew/etc/dnsmasq.conf echo 'listen-address=127.0.0.1' | sudo tee -a /opt/homebrew/etc/dnsmasq.conf # 或者 Intel Mac echo 'address=/.test/127.0.0.1' | sudo tee -a /usr/local/etc/dnsmasq.conf echo 'listen-address=127.0.0.1' | sudo tee -a /usr/local/etc/dnsmasq.conf # 4. 创建 DNS 解析器 sudo mkdir -v /etc/resolver sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/test' # 5. 启动 dnsmasq brew services start dnsmasq # 6. 验证配置 brew services list | grep dnsmasq dig laravel.test @127.0.0.1 # 应该返回:laravel.test. IN A 127.0.0.1如果遇到服务启动失败(error 2):
# 查看系统日志找出具体错误 log show --predicate 'process == "dnsmasq"' --last 5m --info # 常见问题 1:端口 53 被占用 sudo lsof -i :53 # 解决方法:如果有多个 dnsmasq 进程,kill 旧的 sudo kill <PID> # 常见问题 2:配置文件错误 # 测试配置文件语法 sudo dnsmasq --test -C /opt/homebrew/etc/dnsmasq.conf # 重启服务 sudo brew services restart dnsmasq关于 brew services list 显示 error 2:
这是 Apple Silicon (M芯片) Mac 上的已知问题,但不影响实际功能。只要 DNS 解析正常(dig 测试通过),就可以正常使用。
备选方案(简单但手动):
如果 dnsmasq 遇到问题,可以直接编辑 hosts 文件:
# 编辑 hosts 文件 sudo nano /etc/hosts # 添加:127.0.0.1 laravel.test # 添加:127.0.0.1 fund-api.test # 保存后即可使用Xdebug 3.x 已预装在镜像中,配置位于 config/php/php72.ini。
在请求中添加参数:XDEBUG_TRIGGER=1
或使用浏览器扩展:
-
Settings → Languages & Frameworks → PHP → Servers
- Name:
laravel.test - Host:
laravel.test - Port:
80 - Debugger:
Xdebug
- Name:
-
Settings → Languages & Frameworks → PHP → Debug
- Port:
9003(Xdebug 3.x 默认端口)
- Port:
参考视频:PhpStorm Xdebug 配置
在 docker-compose.yml 中已配置 extra_hosts,PHP 容器可以通过域名访问其他服务:
extra_hosts: - "api.test:nginx" # 使用 nginx 容器名,自动解析在 PHP 代码中直接使用服务名:
// 访问 MySQL $host = 'mysql'; // 容器名 $port = 3306; // 访问 Redis $redis = new Redis(); $redis->connect('redis', 6379); // 容器名在 ~/.zshrc 或 ~/.bashrc 中添加:
# Docker Compose 别名 alias dup='docker compose up -d' alias ddown='docker compose down' alias drestart='docker compose restart' alias dlogs='docker compose logs -f' alias dexec='docker compose exec' # 快速进入 PHP 容器 alias dphp='docker compose exec php72 bash'# 查看服务状态 docker compose ps # 查看详细日志 docker compose logs [service_name] # 检查端口占用 lsof -i :80 lsof -i :3306# 修复数据目录权限 sudo chown -R $USER:$USER data/ sudo chmod -R 755 data/# 重建网络 docker compose down docker network prune docker compose up -d- ✅ 更新到 Docker Compose 最新格式(移除 version)
- ✅ 优化 Dockerfile,使用最佳实践
- ✅ 改进网络配置,移除静态 IP 依赖
- ✅ 添加环境变量示例文件
- ✅ 更新服务版本到最新稳定版
- ✅ 优化卷挂载,使用缓存模式提升性能
- ✅ 改进文档,添加更多使用示例
MIT License