1. 项目概述
在macOS系统上搭建完整的Web开发环境,Docker无疑是最优雅的解决方案之一。作为一名长期在macOS平台工作的全栈开发者,我亲测通过Docker容器化部署Nginx+PHP环境,不仅解决了传统安装方式的各种依赖冲突问题,还能实现开发环境的快速复制和迁移。本文将详细记录从零开始的全过程,包括Docker Desktop的安装配置、Nginx与PHP容器的协同部署,以及实际开发中最容易遇到的坑点解决方案。
2. 环境准备
2.1 硬件与系统要求
建议使用配备Apple Silicon芯片(M1/M2)或Intel Core i5及以上处理器的Mac设备,系统版本至少为macOS Monterey(12.0)。我目前在MacBook Pro M1 Pro(16GB内存)上运行Ventura 13.5环境进行演示。特别提醒:若使用M系列芯片,需注意部分x86镜像需要Rosetta 2转译。
2.2 Docker Desktop安装
- 访问Docker官网下载对应芯片版本的Docker Desktop
- 双击下载的.dmg文件,将鲸鱼图标拖拽到Applications文件夹
- 首次启动时会要求授权安装网络组件,需输入系统密码
- 在Preferences → Resources中建议分配:
- CPU: 4核+
- Memory: 6GB+
- Swap: 1GB
注意:安装后若遇到"Virtualization support wasn't detected"错误,需:
- Intel芯片:检查BIOS中VT-x是否启用
- Apple Silicon:确保没有禁用虚拟化扩展
3. Docker基础配置
3.1 镜像加速设置
国内用户建议配置镜像加速器,在Preferences → Docker Engine中添加:
{ "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }3.2 常用命令验证
docker --version # 确认版本(建议20.10+) docker-compose --version # 确认compose版本 docker run hello-world # 测试基础功能4. Nginx+PHP容器部署
4.1 方案选型对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 单容器(nginx+php-fpm) | 部署简单 | 不符合单一职责原则 |
| 多容器链接 | 架构清晰,扩展性强 | 需要配置容器网络 |
| Docker Compose集成 | 一键启动,管理方便 | 学习曲线稍陡 |
推荐使用多容器+Docker Compose方案,下面是具体实现。
4.2 目录结构准备
mkdir -p ~/docker-webapp/{nginx,php,html} cd ~/docker-webapp4.3 编写docker-compose.yml
version: '3.8' services: nginx: image: nginx:1.25-alpine ports: - "8080:80" volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./html:/var/www/html depends_on: - php php: image: php:8.2-fpm-alpine volumes: - ./html:/var/www/html environment: - PHP_MEMORY_LIMIT=256M4.4 Nginx配置文件
在nginx/conf.d下创建app.conf:
server { listen 80; server_name localhost; root /var/www/html; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }5. 环境验证与优化
5.1 启动服务
docker-compose up -d5.2 测试PHP解析
在html目录创建info.php:
<?php phpinfo(); ?>访问 http://localhost:8080/info.php 应显示PHP信息页。
5.3 PHP扩展安装
修改docker-compose.yml中php部分:
php: build: context: ./php dockerfile: Dockerfile创建php/Dockerfile:
FROM php:8.2-fpm-alpine RUN docker-php-ext-install pdo_mysql opcache重建容器:
docker-compose down && docker-compose up -d --build6. 常见问题解决方案
6.1 文件权限问题
当出现文件写入权限错误时,解决方案:
# 查看容器内www-data用户ID docker exec -it webapp-php-1 id www-data # 在宿主机设置相同UID(通常为82) sudo chown -R 82:82 ./html6.2 性能调优参数
在php/Dockerfile中添加:
RUN { \ echo 'opcache.enable=1'; \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.max_accelerated_files=10000'; \ } > /usr/local/etc/php/conf.d/opcache.ini6.3 Xdebug配置(开发环境)
RUN apk add --no-cache $PHPIZE_DEPS \ && pecl install xdebug \ && docker-php-ext-enable xdebug RUN { \ echo 'xdebug.mode=develop,debug'; \ echo 'xdebug.client_host=host.docker.internal'; \ echo 'xdebug.start_with_request=yes'; \ } > /usr/local/etc/php/conf.d/xdebug.ini7. 生产环境建议
7.1 安全加固措施
- 禁用危险函数:
disable_functions = exec,passthru,shell_exec,system- 限制PHP访问路径:
location ~ /\.ht { deny all; }7.2 日志监控配置
services: nginx: logging: driver: "json-file" options: max-size: "10m" max-file: "3"查看日志命令:
docker-compose logs -f nginx7.3 多项目扩展方案
通过修改nginx配置实现:
server { listen 80; server_name project1.local; root /var/www/project1/public; # ... } server { listen 80; server_name project2.local; root /var/www/project2/public; # ... }在/etc/hosts中添加:
127.0.0.1 project1.local project2.local