Docker 和 PHP:高级应用容器化
\n\n使用 Docker 进行容器化早已成为开发和部署 PHP 应用的标准。基础知识——启动一个包含 PHP 和 Nginx 的容器——仅仅是第一步。在高级层面,需要配置多阶段构建、优化镜像大小、处理多个服务、管理环境变量、集成 CI/CD 以及构建微服务架构。本文将剖析关键技巧,助您将 PHP 容器化提升至新高度。
\n\n1. PHP 的多阶段构建
\n\n多阶段构建允许在单个 Dockerfile 中使用多个 FROM 指令。这对于 PHP 应用来说非常理想,因为在构建阶段需要 Composer、Node.js 等工具,而最终镜像中只需包含编译后的文件和最小依赖集。
以 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
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
高级 .dockerignore 示例:
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md\n\n3. 针对复杂 PHP 项目的 Docker Compose
\n\n对于使用数据库、队列、缓存和 Web 服务器的 PHP 应用,docker-compose.yml 成为核心配置文件。高级设置包括:
- \n
- 网络: 隔离服务(例如,数据库不应从外部访问)。 \n
- 卷:<