PHP项目Dockerfile如何编写PHP环境

wen PHP项目 20

本文目录导读:

PHP项目Dockerfile如何编写PHP环境

  1. 基础 PHP 环境 Dockerfile
  2. 配套的 docker-compose.yml
  3. Nginx 配置示例
  4. 使用说明

我来为您提供 PHP 项目的 Dockerfile 编写方案,包含不同场景的配置。

基础 PHP 环境 Dockerfile

基础版(适合简单项目)

# 基础镜像
FROM php:8.2-fpm
# 设置工作目录
WORKDIR /var/www/html
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
# 安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 设置权限(如果使用 Laravel 等框架)
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html/storage \
    && chmod -R 755 /var/www/html/bootstrap/cache
# 暴露端口
EXPOSE 9000
# 启动命令
CMD ["php-fpm"]

生产优化版

FROM php:8.2-fpm-alpine
# 设置工作目录
WORKDIR /var/www/html
# 安装系统依赖(Alpine 版本)
RUN apk add --no-cache \
    git \
    curl \
    libpng-dev \
    libxml2-dev \
    zip \
    unzip \
    && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 生产环境优化
RUN composer install --optimize-autoloader --no-dev \
    && php artisan optimize \
    && php artisan view:cache \
    && php artisan route:cache
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html/storage \
    && chmod -R 755 /var/www/html/bootstrap/cache
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD php-fpm -t || exit 1
EXPOSE 9000
USER www-data
CMD ["php-fpm"]

多阶段构建版

# 第一阶段:构建阶段
FROM composer:2 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader
COPY . .
RUN composer install --optimize-autoloader
# 第二阶段:运行阶段
FROM php:8.2-fpm-alpine
WORKDIR /var/www/html
RUN apk add --no-cache \
    libpng-dev \
    libxml2-dev \
    && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 从构建阶段复制
COPY --from=composer /app /var/www/html
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html/storage \
    && chmod -R 755 /var/www/html/bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]

开发环境版(含 Xdebug)

FROM php:8.2-fpm
WORKDIR /var/www/html
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    nodejs \
    npm \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
# 安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Xdebug
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug
# Xdebug 配置
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.client_port=9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.idekey=PHPSTORM" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 设置权限
RUN chown -R www-data:www-data /var/www/html
EXPOSE 9000
CMD ["php-fpm"]

配套的 docker-compose.yml

version: '3.8'
services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php-app
    volumes:
      - ./:/var/www/html
    ports:
      - "9000:9000"
    depends_on:
      - mysql
    networks:
      - app-network
  nginx:
    image: nginx:alpine
    container_name: nginx-server
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - php
    networks:
      - app-network
  mysql:
    image: mysql:8.0
    container_name: mysql-db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
  redis:
    image: redis:alpine
    container_name: redis-cache
    ports:
      - "6379:6379"
    networks:
      - app-network
volumes:
  mysql-data:
networks:
  app-network:
    driver: bridge

Nginx 配置示例

# nginx/conf.d/app.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /\.ht {
        deny all;
    }
}

使用说明

构建和运行

# 开发环境
docker-compose up -d
# 构建特定环境的镜像
docker build -t my-php-app:latest .
# 运行容器
docker run -d -p 9000:9000 my-php-app

常见 PHP 扩展安装

# 常用扩展安装命令
RUN docker-php-ext-install \
    pdo_mysql \    # MySQL 扩展
    mbstring \     # 多字节字符串
    bcmath \       # 数学计算
    gd \           # 图像处理
    exif \         # EXIF 信息
    pcntl \        # 进程控制
    opcache        # OPcache

性能优化建议

  1. 选择合适的基础镜像

    • 开发环境:php:8.2-fpm(包含完整工具)
    • 生产环境:php:8.2-fpm-alpine(最小体积)
  2. 多阶段构建:分离构建和运行环境

  3. 镜像层优化:合并 RUN 命令,减少层数

  4. 缓存优化:利用 Docker 层缓存机制

  5. 安全设置:使用非 root 用户运行

这样配置的 Dockerfile 能适应大多数 PHP 项目的需求,您可以根据具体项目特点进行调整。

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