ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

macOS下Docker部署Nginx+PHP开发环境指南

macOS下Docker部署Nginx+PHP开发环境指南

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安装

  1. 访问Docker官网下载对应芯片版本的Docker Desktop
  2. 双击下载的.dmg文件,将鲸鱼图标拖拽到Applications文件夹
  3. 首次启动时会要求授权安装网络组件,需输入系统密码
  4. 在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-webapp

4.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=256M

4.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 -d

5.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 --build

6. 常见问题解决方案

6.1 文件权限问题

当出现文件写入权限错误时,解决方案:

# 查看容器内www-data用户ID docker exec -it webapp-php-1 id www-data # 在宿主机设置相同UID(通常为82) sudo chown -R 82:82 ./html

6.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.ini

6.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.ini

7. 生产环境建议

7.1 安全加固措施

  1. 禁用危险函数:
disable_functions = exec,passthru,shell_exec,system
  1. 限制PHP访问路径:
location ~ /\.ht { deny all; }

7.2 日志监控配置

services: nginx: logging: driver: "json-file" options: max-size: "10m" max-file: "3"

查看日志命令:

docker-compose logs -f nginx

7.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
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进