为什么你的PHP项目需要Docker
\n\n你是否曾花费半天时间向新开发人员解释如何配置环境?或者遇到过代码在你的localhost上运行正常,但在服务器上却崩溃的情况?熟悉吗?那么这篇文章就是为你准备的。
Docker不仅仅是一个时髦的流行词。它是一个工具,能将“在我这能运行”变成“在所有人那都能运行”。对于PHP开发者来说,容器化是一种超能力:你将应用程序、Web服务器和数据库打包到轻量级容器中,这些容器在任何机器上的行为都保证一致。
\n\n在本指南中,我们不会阅读枯燥的理论。我们将直接付诸实践:编写Dockerfile用于PHP,通过Docker Compose配置Nginx + PHP-FPM + MySQL组合,并部署一个真实的应用程序。瞬间,你的项目就准备好部署了!
\n\n什么是容器化,为什么PHP开发者需要它?
\n\n想象一下你要搬进新公寓。与其每次都重新组装家具(安装PHP、配置Apache、安装模块),不如直接拿一个装有你环境的现成箱子。Docker就是这样的箱子。它们被称为容器。
\n\n这对PHP尤其重要。PHP版本不断变化,需要不同的扩展(gd、mysqli、redis),而在生产环境中一切必须保持稳定。容器化解决了三个主要问题:
\n- \n
- 可重现性 — 环境对所有人都相同:开发者、测试人员、服务器。 \n
- 隔离性 — 项目之间不会冲突(你再也不会因为PHP更新而破坏旧网站)。 \n
- 部署简单 — 通过一条命令
docker-compose up启动。 \n
为PHP应用准备Dockerfile
\n\n我们从最重要的开始——为我们的PHP项目创建镜像。假设我们有一个使用PDO连接MySQL的简单PHP 8.2应用程序。下面是最小化的Dockerfile的样子:
# 使用官方的PHP 8.2 FPM镜像\nFROM php:8.2-fpm-alpine\n\n# 安装必要的系统包\nRUN apk add --no-cache \\\n nginx \\\n supervisor \\\n libpq-dev \\\n && docker-php-ext-install pdo pdo_mysql\n\n# 复制配置文件(稍后创建)\nCOPY ./docker/nginx.conf /etc/nginx/nginx.conf\nCOPY ./docker/supervisord.conf /etc/supervisord.conf\n\n# 复制应用程序代码\nCOPY . /var/www/html\n\n# 为日志和缓存设置写入权限\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\n# 开放端口\nEXPOSE 80\n\n# 启动supervisor(它将管理nginx和php-fpm)\nCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]\n\n这里重要的是什么?我们使用alpine版本——它体积小得多。只通过docker-php-ext-install安装必要的扩展。是的,我们使用supervisor来让Nginx和PHP-FPM在同一个容器内运行。这对于小型项目来说很方便。
创建Nginx配置
\n\n现在我们需要配置Web服务器。创建文件docker/nginx.conf:
worker_processes auto;\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n\n server {\n listen 80;\n server_name _;\n root /var/www/html/public;\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n }\n}\n\n请注意:PHP-FPM在容器内部监听端口9000