Docker部署PHP项目可以统一开发、测试、生产环境,避免环境差异导致的运行问题,大幅提升部署效率。下面详细介绍完整的部署流程。

一、准备PHP项目文件
首先需要一个可运行的PHP项目,这里以一个简单的PHP测试项目为例,项目目录结构如下:
php_project/
├── index.php
├── Dockerfile
├── docker-compose.yml
└── nginx_conf
└── default.conf
其中index.php是项目入口文件,内容如下:
<?php
echo "Hello Docker PHP Deploy";
// 测试数据库连接
$db_host = getenv('DB_HOST');
$db_user = getenv('DB_USER');
$db_pass = getenv('DB_PASS');
$db_name = getenv('DB_NAME');
if ($db_host && $db_user && $db_pass && $db_name) {
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
echo "数据库连接失败: " . $conn->connect_error;
} else {
echo "数据库连接成功";
$conn->close();
}
}
?>
二、编写Dockerfile构建PHP镜像
Dockerfile用于定义PHP运行环境的镜像,这里选择官方的PHP镜像,并安装必要的扩展:
# 基础镜像选择PHP 8.1的FPM版本 FROM php:8.1-fpm # 安装必要的PHP扩展,比如mysqli用于MySQL连接 RUN docker-php-ext-install mysqli pdo pdo_mysql # 设置工作目录 WORKDIR /var/www/html # 把当前目录的项目文件复制到镜像的工作目录 COPY . /var/www/html
三、编写Nginx配置
PHP项目通常需要Nginx作为Web服务器,转发请求到PHP-FPM,nginx_conf/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;
}
# 转发PHP请求到PHP-FPM容器
location ~ .php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
四、编写docker-compose.yml实现一键部署
docker-compose可以管理多个容器,实现一键启动所有服务,docker-compose.yml内容如下:
version: '3'
services:
# Nginx服务
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx_conf:/etc/nginx/conf.d
- ./:/var/www/html
depends_on:
- php-fpm
# PHP-FPM服务
php-fpm:
build: .
volumes:
- ./:/var/www/html
# MySQL服务(可选,根据项目需求添加)
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: test_db
MYSQL_USER: test_user
MYSQL_PASSWORD: test_pass
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
# 定义数据卷,持久化MySQL数据
volumes:
mysql_data:
五、执行一键部署命令
在php_project目录下执行以下命令即可完成部署:
# 构建镜像并启动所有容器,-d表示后台运行 docker-compose up -d
启动完成后,访问http://127.0.0.1:8080就能看到PHP项目的输出内容。如果需要停止服务,执行以下命令:
docker-compose down
六、部署注意事项
- 项目文件的权限需要正确设置,避免出现无法读取文件的问题,可以在Dockerfile中调整文件所属用户和权限。
- 如果项目需要连接MySQL,要确保环境变量配置正确,容器之间的网络是互通的,docker-compose默认会为所有服务创建同一个网络。
- 生产环境部署时,不要直接暴露数据库端口到宿主机,避免安全风险,可以只在内部网络中让PHP容器访问MySQL容器。
- 如果项目依赖其他服务,比如Redis,只需要在docker-compose.yml中添加对应的服务配置即可,部署流程保持一致。