PHP 8.2 + Nginx Docker 镜像构建:5步实现 Laravel 项目生产级部署

在当今云原生技术蓬勃发展的时代,Docker 已成为现代应用部署的标准工具。对于 PHP 开发者而言,将 Laravel 项目容器化不仅能确保环境一致性,还能显著提升部署效率和系统可扩展性。本文将深入探讨如何基于 PHP 8.2 和 Nginx 构建优化的生产级 Docker 镜像,涵盖从基础镜像选择到最终部署的全流程。

1. 环境准备与基础镜像选择

构建一个高效的 Laravel 生产环境,首先需要精心选择基础镜像。PHP 官方提供了多个版本的基础镜像,我们需要根据生产环境需求做出明智选择。

对于 PHP 8.2,官方镜像提供了多种变体:

FROM php:8.2-fpm-alpine

为什么选择 Alpine 版本?

  • 体积小巧:Alpine Linux 以其极小的体积著称,最终镜像大小可控制在 100MB 以内
  • 安全性高:精简的系统意味着更小的攻击面
  • 资源占用低:特别适合容器化环境和微服务架构

基础依赖安装

RUN apk add --no-cache \
    nginx \
    supervisor \
    libzip-dev \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    oniguruma-dev \
    libxml2-dev \
    postgresql-dev \
    curl \
    git

提示:使用 --no-cache 选项可以避免在镜像中保留不必要的包缓存,进一步减小镜像体积。

2. PHP 扩展安装与优化配置

Laravel 框架运行需要特定的 PHP 扩展支持。通过 Docker 提供的 docker-php-ext-install 工具,我们可以高效地安装所需扩展。

核心扩展安装

RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
    docker-php-ext-install -j$(nproc) \
    pdo_mysql \
    pdo_pgsql \
    zip \
    gd \
    mbstring \
    exif \
    pcntl \
    bcmath \
    opcache \
    xml \
    ctype \
    json \
    tokenizer

性能优化配置

创建 opcache.ini 配置文件:

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

Composer 安装

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

这种多阶段构建方式避免了在最终镜像中包含 Composer 的依赖,显著减小了镜像体积。

3. Nginx 配置与 Laravel 优化

Nginx 作为高性能的 Web 服务器,需要针对 Laravel 进行专门配置。以下是生产环境推荐的配置示例:

Nginx 虚拟主机配置 ( nginx.conf ):

server {
    listen 80;
    server_name example.com;
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Laravel 目录权限设置

RUN chown -R www-data:www-data /var/www/html/storage \
    /var/www/html/bootstrap/cache && \
    chmod -R 775 /var/www/html/storage \
    /var/www/html/bootstrap/cache

注意:生产环境中,敏感文件如 .env 不应直接打包进镜像,而应通过环境变量或 Kubernetes Secrets 等方式注入。

4. 多阶段构建与缓存优化

合理的构建策略可以显著提升镜像构建速度并减小最终镜像体积。以下是优化的多阶段构建方案:

第一阶段:依赖安装

FROM php:8.2-fpm-alpine AS builder

WORKDIR /var/www/html
COPY . .

RUN composer install --no-dev --no-interaction --optimize-autoloader

第二阶段:生产镜像构建

FROM php:8.2-fpm-alpine

COPY --from=builder /var/www/html /var/www/html
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Supervisor 配置 ( supervisord.conf ):

[supervisord]
nodaemon=true

[program:php-fpm]
command=/usr/local/sbin/php-fpm
autostart=true
autorestart=true

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true

这种配置方式确保了 PHP-FPM 和 Nginx 都能作为前台进程运行,符合容器最佳实践。

5. 生产部署与持续集成

完成镜像构建后,我们需要考虑如何将其部署到生产环境。以下是推荐的部署流程:

镜像构建与推送

docker build -t your-registry/laravel-app:8.2 .
docker push your-registry/laravel-app:8.2

Kubernetes 部署示例 ( deployment.yaml ):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: laravel-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: laravel-app
  template:
    metadata:
      labels:
        app: laravel-app
    spec:
      containers:
      - name: laravel
        image: your-registry/laravel-app:8.2
        ports:
        - containerPort: 80
        envFrom:
        - secretRef:
            name: laravel-secrets
        resources:
          limits:
            cpu: "1"
            memory: "512Mi"

环境变量管理

通过 Kubernetes Secrets 管理敏感信息:

kubectl create secret generic laravel-secrets \
  --from-literal=DB_PASSWORD=yourpassword \
  --from-literal=APP_KEY=base64:yourkey

健康检查配置

livenessProbe:
  httpGet:
    path: /health
    port: 80
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 5

通过以上五个关键步骤,我们构建了一个高效、安全且易于维护的 Laravel 生产环境。这种方案不仅充分利用了 PHP 8.2 的性能优势,还通过 Docker 和 Nginx 的最佳实践配置,确保了应用的高可用性和可扩展性。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐