1. 环境准备与Docker安装
在macOS上部署Docker环境是开发者的常见需求,特别是需要搭建本地开发环境时。我最近在M1芯片的MacBook Pro上完整走通了这套流程,记录下关键步骤和踩坑经验。
1.1 系统兼容性检查
首先确认你的macOS版本:
bash复制sw_vers -productVersion
建议系统版本在10.15(Catalina)以上。对于M1/M2芯片的Mac,需要特别注意镜像兼容性问题。我实测发现,部分x86镜像在ARM架构下运行会有性能损耗,建议优先选择多架构或ARM原生镜像。
1.2 Docker Desktop安装
官方推荐通过Docker Desktop进行安装:
- 访问Docker官网下载对应芯片版本的安装包
- 双击下载的.dmg文件,将Docker图标拖到Applications文件夹
- 首次启动时会要求权限授权,全部允许即可
安装完成后,建议进行以下配置:
- 在Preferences → Resources中调整内存分配(4GB以上为宜)
- 启用"Use gRPC FUSE for file sharing"提升文件同步性能
- 在Experimental Features中启用VirtioFS(性能提升显著)
注意:安装后需要重启终端才能使用docker命令
2. Docker基础配置
2.1 镜像加速配置
国内用户建议配置镜像加速器,在Docker Desktop的Preferences → Docker Engine中添加:
json复制{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
保存后点击"Apply & Restart"生效。
2.2 常用命令验证
验证安装是否成功:
bash复制docker --version
docker-compose --version
docker run hello-world
如果看到欢迎信息说明环境已就绪。
3. Nginx+PHP环境部署
3.1 镜像选择策略
经过对比测试,我推荐以下组合:
- Nginx: 官方latest镜像(约133MB)
- PHP: php:8.2-fpm镜像(约450MB)
对于生产环境,建议指定具体版本号而非latest标签。
3.2 目录结构规划
建议采用以下项目结构:
code复制project/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ └── default.conf
│ └── nginx.conf
├── php/
│ └── Dockerfile
└── www/
└── index.php
3.3 Nginx配置
在nginx/conf.d/default.conf中配置:
nginx复制server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
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;
}
}
3.4 PHP Dockerfile
在php/Dockerfile中扩展官方镜像:
dockerfile复制FROM php:8.2-fpm
RUN docker-php-ext-install pdo pdo_mysql
COPY www/ /var/www/html/
4. Docker Compose编排
4.1 compose文件编写
docker-compose.yml核心内容:
yaml复制version: '3'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/var/www/html
depends_on:
- php
php:
build: ./php
volumes:
- ./www:/var/www/html
4.2 服务启动与验证
启动服务:
bash复制docker-compose up -d --build
验证服务:
- 访问http://localhost:8080应看到Nginx欢迎页
- 在www目录创建info.php测试文件:
php复制<?php phpinfo(); ?>
访问http://localhost:8080/info.php应显示PHP配置信息
5. 常见问题排查
5.1 端口冲突处理
如果8080端口被占用,可以:
- 修改compose文件中的端口映射
- 查找并终止占用进程:
bash复制lsof -i :8080
kill -9 <PID>
5.2 文件权限问题
Docker容器内默认使用root用户,可能导致宿主机文件权限混乱。解决方案:
- 在Dockerfile中添加:
dockerfile复制RUN chown -R www-data:www-data /var/www/html
- 或者在compose文件中指定用户:
yaml复制user: "${UID:-1000}:${GID:-1000}"
5.3 PHP扩展安装
如需额外PHP扩展,可以通过docker-php-ext-install安装:
dockerfile复制RUN docker-php-ext-install mysqli && \
docker-php-ext-enable mysqli
6. 性能优化建议
6.1 开发环境优化
- 启用Docker的缓存机制:
yaml复制php:
build:
context: ./php
cache_from:
- php:8.2-fpm
- 使用docker-sync解决macOS文件同步性能问题
6.2 生产环境建议
- 使用多阶段构建减小镜像体积
- 配置Nginx缓存和PHP OPcache
- 设置合理的资源限制:
yaml复制deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
7. 进阶配置
7.1 Xdebug配置
在PHP容器中启用Xdebug:
dockerfile复制RUN pecl install xdebug && \
docker-php-ext-enable xdebug
添加xdebug.ini配置:
ini复制xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.start_with_request=yes
7.2 多项目配置
通过修改nginx配置支持多项目:
nginx复制server {
listen 80;
server_name project1.test;
root /var/www/html/project1/public;
# ...
}
server {
listen 80;
server_name project2.test;
root /var/www/html/project2/public;
# ...
}
在hosts文件中添加:
code复制127.0.0.1 project1.test project2.test
8. 日常维护技巧
8.1 常用命令备忘
查看运行中的容器:
bash复制docker ps
查看容器日志:
bash复制docker-compose logs -f nginx
进入容器shell:
bash复制docker-compose exec php bash
8.2 数据备份策略
- 定期导出数据库:
bash复制docker exec -i mysql_container mysqldump -u root -p database > backup.sql
- 备份重要卷数据:
bash复制docker run --rm --volumes-from app_container -v $(pwd):/backup busybox tar cvf /backup/app_data.tar /app/data
9. 容器化开发实践
9.1 开发流程优化
- 使用docker-compose.override.yml配置开发环境特定设置
- 配置IDE使用Docker内的PHP解释器
- 实现代码修改自动重启服务:
yaml复制php:
volumes:
- ./www:/var/www/html
environment:
- PHP_OPCACHE_VALIDATE_TIMESTAMPS=1
9.2 CI/CD集成
在GitHub Actions中集成Docker构建:
yaml复制jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: docker-compose build
- run: docker-compose up -d
- run: docker-compose exec php phpunit
10. 安全加固措施
10.1 最小权限原则
- 避免使用root用户运行容器:
dockerfile复制RUN useradd -u 1000 -d /home/devuser devuser
USER devuser
- 限制容器能力:
yaml复制security_opt:
- no-new-privileges:true
cap_drop:
- ALL
10.2 镜像安全扫描
定期扫描镜像漏洞:
bash复制docker scan nginx:latest
更新基础镜像:
dockerfile复制FROM php:8.2-fpm@sha256:具体校验码
经过完整实践,这套环境已经稳定运行了6个月,支撑了多个PHP项目的并行开发。最大的收获是理解了容器网络和存储卷的实际工作机制,这比单纯照搬教程要重要得多。对于M1芯片用户,建议多关注ARM架构镜像的生态发展,目前主流镜像基本都已提供原生支持。