Docker部署php:Docker部署PHP环境
Docker部署PHP环境:从零开始的完整步骤
很多新手在配置PHP运行环境时,总被手动编译、扩展冲突、路径混乱等问题劝退。
用 Docker部署PHP 能彻底隔离环境,换服务器也能一键还原。
本文从零开始,带你完整跑通一个带Nginx + PHP-FPM + MySQL的容器化PHP应用。
准备工作:检查你的服务器
你需要一台安装了Linux(Ubuntu/CentOS均可)的服务器,并确保 Docker 和 Docker Compose 已安装。
如果还没装,执行以下命令(以Ubuntu为例):
# 自动安装Docker
curl -fsSL https://get.docker.com | bash
# 启动Docker并设置开机自启
sudo systemctl start docker && sudo systemctl enable docker
# 安装Docker Compose(可选,但强烈推荐)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
安装完成后运行 docker version 确认版本信息。
如果出现 Cannot connect to the Docker daemon,说明当前用户不在docker用户组,执行 sudo usermod -aG docker $USER 并重新登录即可。
搭建 Docker 部署 PHP 的核心结构
用 Docker部署PHP 最常见的方式是使用 docker-compose.yml 同时管理 Nginx、PHP-FPM 和 MySQL,这样一条命令就能启动所有服务。
1. 创建项目目录
mkdir ~/php-project && cd ~/php-project
mkdir -p nginx/conf.d php www mysql/data
2. 编写 php 和 nginx 配置文件
在 nginx/conf.d/ 下新建 default.conf,内容如下:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
在 php/ 下新建一个 Dockerfile(可省略,直接用官方镜像也可),我们直接使用 php:8.2-fpm 镜像。
3. 编写 docker-compose.yml
在项目根目录创建 docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./www:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./www:/var/www/html
# 如果需要连接MySQL,可以在此安装pdo_mysql扩展
# 推荐在Dockerfile中处理,这里不做赘述
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
4. 启动容器
docker-compose up -d
等待镜像拉取并启动完成后,访问服务器IP即可看到Nginx默认页面。
避坑指南:Docker部署PHP容易踩的坑
- 权限问题:容器内的PHP-FPM默认以www-data用户运行,而你的代码文件如果属主是root,可能导致无法写入上传目录。推荐在宿主机把
www/目录属主改为www-data:www-data(UID 82)。 - 扩展缺失:如果你的PHP代码需要连接MySQL,默认官方镜像没有pdo_mysql扩展。你可以在
php/目录下新建Dockerfile:
FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql
然后修改 docker-compose.yml 中的 php 服务:build: ./php 替代 image: php:8.2-fpm。
- 端口被占用:本机80端口已被Nginx占用时,修改
docker-compose.yml中nginx的端口映射,如"8080:80"。
效果验证:跑一个PHP探针
在 www/ 目录下创建 info.php,内容:
访问 http://你的服务器IP/info.php,如果看到PHP信息页面,且PDO/MySQL等扩展正常,说明 Docker部署PHP 成功。
记得删除或限制 info.php 的访问权限。
如果页面直接下载或显示空白,
最常见的原因是Nginx没有正确转发PHP请求到FastCGI,
请检查 default.conf 中的 fastcgi_pass php: 是否写对了服务名。
9000;
总结与下一步
通过以上步骤,你已经用 Docker部署PHP 搭建了一个包含Nginx、PHP-FPM和MySQL的开发环境。
后续你可以拉取代码、配置域名、甚至使用Docker Compose管理多个项目。
如果遇到 502 Bad Gateway,优先检查PHP-FPM是否正常运行(docker-compose logs php)。
保持这个流程,容器化运维其实比想象中简单。
如果你正在处理 Docker部署PHP 的场景,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。