PHP环境Docker化怎么写

wen PHP项目 1

本文目录导读:

PHP环境Docker化怎么写

  1. 基础项目结构
  2. PHP Dockerfile
  3. PHP配置文件
  4. docker-compose.yml(开发环境)
  5. docker-compose.prod.yml(生产环境)
  6. 生产环境Dockerfile
  7. 生产环境PHP配置
  8. Nginx配置
  9. 环境变量文件
  10. 常用命令
  11. .dockerignore文件

我来提供一个完整的PHP环境Docker化方案,包含开发环境和生产环境的配置。

基础项目结构

project/
├── docker/
│   ├── php/
│   │   ├── Dockerfile
│   │   └── php.ini
│   ├── nginx/
│   │   ├── nginx.conf
│   │   └── conf.d/
│   │       └── default.conf
│   └── mysql/
│       └── my.cnf
├── docker-compose.yml
├── docker-compose.prod.yml
├── .env
├── .env.example
└── src/
    └── index.php

PHP Dockerfile

# docker/php/Dockerfile
FROM php:8.2-fpm
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    zip \
    unzip \
    libpq-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libssl-dev \
    pkg-config \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql \
        mysqli \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip \
        intl \
        opcache
# 安装Redis扩展
RUN pecl install redis && docker-php-ext-enable redis
# 安装Xdebug(开发环境)
RUN pecl install xdebug && docker-php-ext-enable xdebug
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www/html
# 复制配置文件
COPY docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini
# 清理缓存
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# 设置权限
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
EXPOSE 9000
CMD ["php-fpm"]

PHP配置文件

; docker/php/php.ini
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 300
memory_limit = 256M
date.timezone = Asia/Shanghai
; 开发环境配置
display_errors = On
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php/error.log
; OpCache配置
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.fast_shutdown = 1
; Xdebug配置
xdebug.mode = debug
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.start_with_request = yes

docker-compose.yml(开发环境)

version: '3.8'
services:
  # PHP服务
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    container_name: ${PROJECT_NAME}_php
    restart: unless-stopped
    volumes:
      - ./src:/var/www/html
      - ./docker/php/php.ini:/usr/local/etc/php/conf.d/custom.ini
    environment:
      - PHP_IDE_CONFIG=serverName=Docker
    networks:
      - app-network
    extra_hosts:
      - "host.docker.internal:host-gateway"
  # Nginx服务
  nginx:
    image: nginx:alpine
    container_name: ${PROJECT_NAME}_nginx
    restart: unless-stopped
    ports:
      - "${NGINX_PORT}:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/conf.d:/etc/nginx/conf.d
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - php
    networks:
      - app-network
  # MySQL服务
  mysql:
    image: mysql:8.0
    container_name: ${PROJECT_NAME}_mysql
    restart: unless-stopped
    ports:
      - "${MYSQL_PORT}:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    networks:
      - app-network
  # Redis服务
  redis:
    image: redis:7-alpine
    container_name: ${PROJECT_NAME}_redis
    restart: unless-stopped
    ports:
      - "${REDIS_PORT}:6379"
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - app-network
  # Adminer(数据库管理工具,可选)
  adminer:
    image: adminer:latest
    container_name: ${PROJECT_NAME}_adminer
    restart: unless-stopped
    ports:
      - "8080:8080"
    networks:
      - app-network
networks:
  app-network:
    driver: bridge
volumes:
  mysql_data:
  redis_data:

docker-compose.prod.yml(生产环境)

version: '3.8'
services:
  # PHP服务
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile.prod
    container_name: ${PROJECT_NAME}_php
    restart: always
    volumes:
      - ./src:/var/www/html:ro
      - ./storage:/var/www/html/storage
    environment:
      - APP_ENV=production
    networks:
      - app-network
  # Nginx服务
  nginx:
    image: nginx:alpine
    container_name: ${PROJECT_NAME}_nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./src:/var/www/html:ro
      - ./docker/nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certbot/conf:/etc/nginx/ssl:ro
      - ./certbot/www:/var/www/certbot
    depends_on:
      - php
    networks:
      - app-network
  # MySQL服务
  mysql:
    image: mysql:8.0
    container_name: ${PROJECT_NAME}_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network
  # Redis服务
  redis:
    image: redis:7-alpine
    container_name: ${PROJECT_NAME}_redis
    restart: always
    command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - app-network
networks:
  app-network:
    driver: bridge
volumes:
  mysql_data:
  redis_data:

生产环境Dockerfile

# docker/php/Dockerfile.prod
FROM php:8.2-fpm
# 安装系统依赖(精简)
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libssl-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql \
        mysqli \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip \
        intl \
        opcache \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# 复制生产配置
COPY docker/php/php.prod.ini /usr/local/etc/php/conf.d/custom.ini
# 非root用户运行
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
USER www-data
EXPOSE 9000
CMD ["php-fpm"]

生产环境PHP配置

; docker/php/php.prod.ini
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 300
memory_limit = 256M
date.timezone = Asia/Shanghai
; 生产环境配置
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_log = /var/log/php/error.log
; OpCache配置(生产优化)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
opcache.validate_timestamps = 0
; 安全配置
expose_php = Off
session.cookie_httponly = 1
session.use_strict_mode = 1

Nginx配置

# docker/nginx/conf.d/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;
    # 日志配置
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
    # PHP配置
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param APP_ENV development;
    }
    # 其他配置
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

环境变量文件

# .env.example
# 项目配置
PROJECT_NAME=php_app
# 端口配置
NGINX_PORT=8080
MYSQL_PORT=3306
REDIS_PORT=6379
# MySQL配置
MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=app_database
MYSQL_USER=app_user
MYSQL_PASSWORD=app_password
# Redis配置
REDIS_PASSWORD=redis_password

常用命令

# 启动开发环境
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 进入PHP容器
docker-compose exec php bash
# 运行Composer命令
docker-compose exec php composer install
# 运行Artisan命令(Laravel)
docker-compose exec php php artisan migrate
# 停止服务
docker-compose stop
# 重新构建
docker-compose up -d --build
# 生产环境
docker-compose -f docker-compose.prod.yml up -d
# 一键部署脚本
#!/bin/bash
# deploy.sh
echo "开始部署..."
git pull origin main
docker-compose -f docker-compose.prod.yml up -d --build
docker-compose -f docker-compose.prod.yml exec php php artisan migrate --force
docker-compose -f docker-compose.prod.yml exec php php artisan config:cache
docker-compose -f docker-compose.prod.yml exec php php artisan route:cache
docker-compose -f docker-compose.prod.yml exec php php artisan view:cache
echo "部署完成!"

.dockerignore文件

.git
.gitignore
.env
.env.*
!.env.example
node_modules
vendor
storage
*.log
.DS_Store
docker-compose*.yml

这个方案提供了:

  • 完整的开发环境(含Xdebug调试)
  • 生产环境优化配置
  • 多服务容器编排
  • 数据持久化
  • 环境变量管理
  • 一键部署支持

你可以根据项目需求(Laravel、WordPress、ThinkPHP等)调整配置。

抱歉,评论功能暂时关闭!