当前位置:首页>php>PHP 实战 Docker 运维:从环境搭建到生产上线,一套可直接落地的标准方案

PHP 实战 Docker 运维:从环境搭建到生产上线,一套可直接落地的标准方案

  • 2026-09-03 15:12:26
PHP 实战 Docker 运维:从环境搭建到生产上线,一套可直接落地的标准方案
作为PHP开发者,Docker是解决环境不一致、部署繁琐、运维低效的核心工具。本文专注实战,不讲废话,直接给可复制的配置、规范、运维命令与避坑技巧,覆盖本地开发→服务器部署→日常维护全流程。

一、核心原则(PHP项目必看)

  • 分离服务
    Nginx、PHP-FPM、MySQL、Redis 分容器运行,不做“一锅炖”镜像。
  • 数据持久化
    数据库、上传文件、日志必须挂数据卷,容器删数据不丢。
  • 最小权限
    生产禁用root运行PHP,镜像只装必要扩展。
  • 环境隔离
    本地/测试/生产用同一套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化避坑清单

  1. 数据库连不上
    • 主机名不要写127.0.0.1,写服务名mysql。
  2. 502 Bad Gateway
    • Nginx的fastcgi_pass指向php:9000,不是本地9000。
  3. 权限报错(Permission denied)
    • 宿主机目录权限设为755,文件644;容器内用www-data运行。
  4. 性能差
    • 开启opcache;PHP-FPM进程数按CPU核心×2~4设置。
  5. 镜像太大
    • 必须用alpine版本;多阶段构建,不装dev依赖。

七、生产环境加固规范

  1. 禁用端口直接暴露MySQL/Redis,只给内部网络访问。
  2. 敏感信息(密码、密钥)放.env,绝不写进镜像。
  3. 日志挂载到宿主机,方便排查与日志收集。
  4. 所有服务restart: always,宕机自动拉起。
  5. 定期更新基础镜像,修复漏洞。

八、效率提升技巧

  1. 本地开发
    代码目录挂载,修改实时生效,不用重启容器。
  2. 统一环境
    团队共用一套docker-compose,告别“我本地能跑”。
  3. 一键迁移
    打包代码+配置,任意服务器up -d直接上线。
  4. 多版本共存
    同时跑PHP7.4/8.1/8.2,互不冲突。

总结

Docker对PHP开发者不是可选技能,而是标准化开发与运维的底座。按本文配置直接落地,可快速实现环境统一、一键部署、稳定运维,大幅减少线上问题与部署时间。

最新文章

随机文章