使用 Docker 容器化 PHP 应用程序:开发者完整指南

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

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

开始课程

为什么每个 PHP 开发者都应该掌握 Docker?

\n\n

您是否遇到过这样的情况:本地运行一切完美,但服务器上却出现“白屏死机”?或者更糟的是,当同事说“我这边没问题,更新一下 composer”时,您的项目就崩溃了?熟悉吗?那么欢迎来到使用 Docker 容器化 PHP 应用程序的世界。

\n\n

Docker 不仅仅是一个时髦的流行词。它是一个将永远改变您开发方式的工具。想象一下:您不再需要花费数小时来配置环境。无需安装 XAMPP、OpenServer 或纠结于 PHP 版本。只需一个 docker-compose up 命令,您的应用程序就会在一个隔离、可预测的环境中运行。而且这个环境可以传递给同事、上传到服务器,甚至出售给客户。在本文中,我们将从 A 到 Z 全面讲解 PHP 应用程序的容器化:从基本的 Dockerfile 到生产环境优化。

\n\n

什么是容器化,为什么 PHP 需要它?

\n\n

容器化是一种将应用程序及其所有依赖项(PHP、扩展、Web 服务器、数据库)打包到隔离环境(即容器)中的方法。与虚拟机不同,容器轻量级、秒级启动且资源消耗极少。

\n\n

这对 PHP 尤其重要。为什么?因为典型的 PHP 应用程序是一套组合:PHP-FPM、Nginx 或 Apache、MySQL/PostgreSQL、Redis、任务队列。在每台机器上手动配置这个生态系统简直是噩梦。而使用 Docker,您可以用代码描述整个基础设施(基础设施即代码),并通过一条命令重现它。

\n\n

容器化对 PHP 开发者的主要优势:

\n
    \n
  • 环境一致性:本地环境 = 预发布环境 = 生产环境。告别“在我这里能运行”的问题。
  • \n
  • 依赖隔离:PHP 7.4 项目可以与 PHP 8.3 项目在同一台主机上和平共处。
  • \n
  • 快速部署:只需将镜像推送到 registry 并更新服务器上的容器即可。
  • \n
  • 可扩展性:在高负载下轻松添加另一个 PHP-FPM 容器。
  • \n
\n\n

为 PHP 应用程序创建第一个 Dockerfile

\n\n

我们从最重要的部分开始——Dockerfile。这是构建应用程序镜像的指令。假设我们有一个基于 Laravel 或 Symfony 的简单 PHP 应用程序(任何框架的原理都相同)。

\n\n
# 使用官方 PHP 8.2 FPM 镜像\nFROM php:8.2-fpm-alpine\n\n# 安装系统依赖\nRUN apk add --no-cache \\\n    nginx \\\n    supervisor \\\n    libpng-dev \\\n    libjpeg-turbo-dev \\\n    freetype-dev \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n    && docker-php-ext-install -j$(nproc) pdo_mysql gd opcache\n\n# 复制配置文件\nCOPY ./docker/nginx.conf /etc/nginx/http.d/default.conf\nCOPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf\nCOPY ./docker/php.ini /usr/local/etc/php/conf.d/custom.ini\n\n# 安装 Composer\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\n# 复制应用程序源代码\nCOPY . /var/www/html\nWORKDIR /var/www/html\n\n# 安装 PHP 依赖\nRUN composer install --no-dev --optimize-autoloader\n\n# 设置权限\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\nEXPOSE 80\n\nCMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
\n\n

逐项解析:

\n
    \n
  • FROM php:8.2-fpm-alpine — 使用基于 Alpine Linux 的轻量级镜像。它大约只有 50 MB,而桌面版镜像超过 200 MB。
  • \n
  • docker-php-ext-install — 用于在容器内直接安装 PHP 扩展的神奇命令。
  • \n
  • COPY --from=composer:latest — 多阶段构建。我们从官方镜像中获取现成的 Composer 二进制文件,无需单独安装 PHP。

博客

书籍推荐