Docker 和 PHP:高级应用容器化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Docker 和 PHP:高级应用容器化

\n\n

使用 Docker 进行容器化早已成为开发和部署 PHP 应用的标准。基础知识——启动一个包含 PHP 和 Nginx 的容器——仅仅是第一步。在高级层面,需要配置多阶段构建、优化镜像大小、处理多个服务、管理环境变量、集成 CI/CD 以及构建微服务架构。本文将剖析关键技巧,助您将 PHP 容器化提升至新高度。

\n\n

1. PHP 的多阶段构建

\n\n

多阶段构建允许在单个 Dockerfile 中使用多个 FROM 指令。这对于 PHP 应用来说非常理想,因为在构建阶段需要 Composer、Node.js 等工具,而最终镜像中只需包含编译后的文件和最小依赖集。

\n\n

以 Laravel 应用为例的多阶段构建 Dockerfile:

\n\n
# 阶段 1:安装依赖并构建\nFROM composer:2.5 AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --optimize-autoloader --no-interaction\n\nFROM node:18 AS frontend\nWORKDIR /app\nCOPY package.json package-lock.json ./\nRUN npm ci --only=production\nCOPY resources/ ./resources/\nRUN npm run production\n\n# 阶段 2:最终镜像\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# 安装必要的 PHP 扩展\nRUN apk add --no-cache \\\n        libpng-dev \\\n        libjpeg-turbo-dev \\\n        freetype-dev \\\n        libzip-dev \\\n        oniguruma-dev \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n    && docker-php-ext-install -j$(nproc) \\\n        pdo_mysql \\\n        mbstring \\\n        gd \\\n        zip \\\n        opcache\n\n# 仅从先前阶段复制必要文件\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# 为生产环境优化\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]
\n\n

关键优势:

\n
    \n
  • 最终镜像仅包含运行时依赖(PHP-FPM、扩展、代码)。
  • \n
  • 构建工具(Composer、Node.js)不会进入生产环境。
  • \n
  • 显著减小镜像大小(从 800-900 MB 降至 150-200 MB)。
  • \n
\n\n

2. 优化 PHP 的 Docker 镜像大小

\n\n

小镜像加载更快,占用更少磁盘空间,并降低攻击面。主要策略:

\n\n
    \n
  • 使用 alpine 版本的基础镜像。 php:8.2-fpm-alpine 约 50 MB,而标准 php:8.2-fpm 约 400 MB。
  • \n
  • 最小化层数。 使用 && 合并 RUN 命令。
  • \n
  • 删除临时文件。 安装扩展后清理缓存:docker-php-source delete 和 apk del .build-deps。
  • \n
  • 使用 .dockerignore。 排除 .git、node_modules、tests、.env 等不必要的文件。
  • \n
\n\n

高级 .dockerignore 示例:

\n\n
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md
\n\n

3. 针对复杂 PHP 项目的 Docker Compose

\n\n

对于使用数据库、队列、缓存和 Web 服务器的 PHP 应用,docker-compose.yml 成为核心配置文件。高级设置包括:

\n\n
    \n
  • 网络: 隔离服务(例如,数据库不应从外部访问)。
  • \n
  • 卷:<

博客

书籍推荐