作为PHP开发者,Docker是解决环境不一致、部署繁琐、运维低效的核心工具。本文专注实战,不讲废话,直接给可复制的配置、规范、运维命令与避坑技巧,覆盖本地开发→服务器部署→日常维护全流程。一、核心原则(PHP项目必看)
- 分离服务Nginx、PHP-FPM、MySQL、Redis 分容器运行,不做“一锅炖”镜像。
- 数据持久化数据库、上传文件、日志必须挂数据卷,容器删数据不丢。
- 最小权限
- 环境隔离本地/测试/生产用同一套
docker-compose.yml,差异用.env管理。
二、基础环境一键安装(Linux服务器)
# Dockercurl -fsSL https://get.docker.com | bashsystemctl enable docker && systemctl start docker# Docker Compose v2cp /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/chmod +x /usr/bin/docker-compose
三、PHP项目标准目录结构
项目根目录/├── docker/│ ├── nginx/ # Nginx配置│ ├── php/ # PHP Dockerfile、php.ini│ └── mysql/ # MySQL配置、初始化脚本├── src/ # 项目代码├── .env # 环境变量(数据库密码等)└── docker-compose.yml # 核心编排文件
四、核心配置
1. PHP-FPM Dockerfile(生产级)
FROM php:8.2-fpm-alpine# 安装系统依赖与PHP扩展RUN apk add --no-cache libpng-dev libjpeg-turbo-dev freetype-dev libzip-dev oniguruma-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) pdo_mysql mysqli gd zip opcache mbstring# 生产配置COPY docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini# 非root运行RUN adduser -D www-data -H -u 1000USER www-dataWORKDIR /var/www/htmlEXPOSE 9000CMD ["php-fpm"]
2. docker-compose.yml(LNMP完整编排)
version: '3.8'services: nginx: image: nginx:alpine ports: - "80:80" volumes: - ./src:/var/www/html - ./docker/nginx:/etc/nginx/conf.d - ./logs/nginx:/var/log/nginx restart: always depends_on: - php php: build: context: . dockerfile: docker/php/Dockerfile volumes: - ./src:/var/www/html - ./logs/php:/var/log/php restart: always environment: - APP_ENV=production mysql: image: mysql:8.0 volumes: - mysql_data:/var/lib/mysql - ./docker/mysql:/docker-entrypoint-initdb.d restart: always environment: - MYSQL_ROOT_PASSWORD=root123456 - MYSQL_DATABASE=php_app - MYSQL_USER=phpuser - MYSQL_PASSWORD=php123456 redis: image: redis:alpine volumes: - redis_data:/data restart: alwaysvolumes: mysql_data: redis_data:
五、运维核心命令(背下来
)
# 启动/重启/停止docker-compose up -ddocker-compose restartdocker-compose down# 查看日志(实时)docker-compose logs -f nginxdocker-compose logs -f php# 进入容器docker-compose exec php shdocker-compose exec mysql bash# 重新构建PHP镜像(改了Dockerfile后用)docker-compose up -d --build php# 清理无用镜像/卷(释放空间)docker system prune -a --volumes
六、PHP项目Docker化避坑清单
- 数据库连不上
- 主机名不要写
127.0.0.1,写服务名mysql。
- 502 Bad Gateway
- Nginx的
fastcgi_pass指向php:9000,不是本地9000。
- 权限报错(Permission denied)
- 宿主机目录权限设为
755,文件644;容器内用www-data运行。
- 性能差
- 开启
opcache;PHP-FPM进程数按CPU核心×2~4设置。
- 镜像太大
- 必须用
alpine版本;多阶段构建,不装dev依赖。
七、生产环境加固规范
- 禁用端口直接暴露MySQL/Redis,只给内部网络访问。
- 所有服务
restart: always,宕机自动拉起。
八、效率提升技巧
- 本地开发
- 统一环境团队共用一套
docker-compose,告别“我本地能跑”。 - 一键迁移
- 多版本共存
总结
Docker对PHP开发者不是可选技能,而是标准化开发与运维的底座。按本文配置直接落地,可快速实现环境统一、一键部署、稳定运维,大幅减少线上问题与部署时间。