在Windows上配置PHP与Docker Compose的详细指南
在现代Web开发中,PHP与Docker Compose的组合为开发者提供了一致且隔离的开发环境。通过Docker,你可以在Windows上快速搭建PHP应用,而无需手动安装Apache、MySQL等依赖。本文将详细介绍如何从零开始在Windows上配置PHP与Docker Compose,涵盖环境准备、项目结构、容器编写及运行验证等步骤。
一、前置条件
在开始之前,请确保你的Windows系统满足以下要求:
- Windows 10 64位专业版、企业版或教育版(版本1903或更高),或者Windows 11
- 已开启硬件虚拟化(BIOS中启用Intel VT-x或AMD-V)
- 拥有管理员权限以安装软件
你将需要安装以下核心工具:
- Docker Desktop for Windows
- 一个代码编辑器(如VS Code)
- Git(可选,用于版本控制)
二、安装Docker Desktop for Windows
Docker Desktop是Windows上运行Docker容器的基础环境。它集成了Docker Engine、Docker CLI以及Docker Compose。
访问Docker官方网站并下载Docker Desktop for Windows安装程序。安装过程中,建议勾选“使用WSL 2作为后端”选项,因为WSL 2提供更好的性能和兼容性。
安装完成后,重启系统并启动Docker Desktop。在任务栏托盘中,Docker图标显示为稳定状态(白色鲸鱼)即表示运行正常。你可以打开命令提示符或PowerShell,运行以下命令验证:
docker --version docker-compose --version
如果输出显示版本号,说明安装成功。
三、创建PHP项目结构
接下来,在Windows的文件系统中创建一个项目目录,用于存放你的PHP代码和Docker配置文件。假设项目名称为php-docker-app,目录结构如下:
php-docker-app/
├── docker-compose.yml
├── Dockerfile
├── src/
│ └── index.php
└── nginx/
└── default.conf在src/目录下创建一个简单的PHP文件,用于后续测试:
<?php phpinfo(); ?>
这个文件将输出PHP的配置信息,方便我们确认环境是否搭建成功。
四、编写Dockerfile配置PHP环境
Dockerfile用于定义PHP镜像的构建规则。在项目根目录下创建Dockerfile文件,内容如下:
FROM php:8.2-fpm
# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
zip \
unzip \
git \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo_mysql mysqli
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www/html
# 复制项目文件
COPY src/ /var/www/html/
# 配置PHP-FPM
EXPOSE 9000
CMD ["php-fpm"]这段配置基于官方PHP 8.2 FPM镜像,安装了GD库、PDO MySQL扩展以及Composer依赖管理工具。你可以根据项目需求调整PHP版本和扩展列表。
五、编写docker-compose.yml文件
docker-compose.yml是整个服务的编排文件,它定义了PHP应用、Web服务器和数据库等服务。在项目根目录创建docker-compose.yml:
version: '3.8'
services:
php:
build:
context: .
dockerfile: Dockerfile
container_name: php-app
volumes:
- ./src:/var/www/html
networks:
- app-network
nginx:
image: nginx:latest
container_name: nginx-server
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app-network
mysql:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpassword
ports:
- "3307:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql_data:在这个配置中:
- php服务:基于Dockerfile构建,将源码挂载到容器内,并连接到内部网络。
- nginx服务:使用官方Nginx镜像,将8080端口映射到容器的80端口,依赖于PHP服务启动。
- mysql服务:使用MySQL 8.0镜像,设置管理员和普通用户账号,并将数据持久化到命名卷中。
六、配置Nginx反向代理
为了让Nginx正确地将PHP请求转发到PHP-FPM,需要在nginx/default.conf中编写虚拟主机配置:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}注意fastcgi_pass php:9000中的php对应docker-compose.yml中定义的php服务名称,Docker内部DNS会自动解析。
七、启动容器并验证
完成所有配置后,在项目根目录打开终端(PowerShell或CMD),执行以下命令:
docker-compose up -d
该命令将构建PHP镜像、拉取Nginx和MySQL镜像,并在后台启动所有容器。首次构建可能需要几分钟时间,具体取决于网络速度。
启动完成后,运行docker-compose ps查看容器状态,所有服务都应显示为Up。
打开浏览器,访问http://localhost:8080,如果看到PHP信息页面,说明配置成功。
八、常用命令与后续操作
开发过程中,你可能需要频繁与容器交互。以下是一些常用命令:
- 查看容器日志:
docker-compose logs -f [服务名] - 进入PHP容器Shell:
docker-compose exec php bash - 停止并移除所有容器:
docker-compose down - 重新构建某个服务:
docker-compose build php
若要修改PHP配置(例如调整upload_max_filesize),可以在Dockerfile中添加自定义配置或挂载配置文件。例如:
COPY custom.ini /usr/local/etc/php/conf.d/
然后在custom.ini中写入:
upload_max_filesize = 20M post_max_size = 20M
九、常见问题与解决方法
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 端口8080被占用 | 其他程序占用了该端口 | 修改docker-compose.yml中ports映射,例如改为"8081:80" |
| PHP文件未生效 | Nginx无法连接PHP-FPM | 检查nginx/default.conf中fastcgi_pass的地址是否与docker-compose服务名匹配 |
| MySQL连接失败 | 主机地址或端口配置错误 | 在PHP代码中使用服务名mysql作为主机,端口为3306 |
| 文件权限问题 | Windows与Linux文件权限不一致 | 在Dockerfile中设置RUN chmod -R 755 /var/www/html |
十、总结
通过以上步骤,你已经在Windows上成功配置了PHP与Docker Compose的开发环境。整个过程涵盖了Docker Desktop的安装、项目结构设计、Dockerfile编写、服务编排以及Nginx反向代理设置。这套环境不仅便于团队协作,也能确保开发、测试和生产环境的一致性。
随着项目的增长,你可以进一步扩展docker-compose.yml,添加Redis、Elasticsearch等服务,或者使用Docker Compose的网络别名实现服务间的高速通信。掌握这些技能后,你将能更高效地管理和部署PHP应用。