Docker 安装 PHP:从零开始搭建本地开发环境
在开发 Web 应用时,PHP 是许多项目的核心语言之一,尤其是像 Laravel、Symfony 这类框架的忠实用户。然而,直接在本地机器上安装 PHP 可能会遇到版本冲突、依赖混乱、环境不一致等问题。这时候,Docker 就成了一个非常实用的解决方案。
Docker 安装 PHP 的最大优势在于——它将 PHP 环境“容器化”,让你在任何设备上都能获得一致的运行环境。就像你用一个标准的“行李箱”装好所有必需品,无论走到哪里,打开就能用。接下来,我们就一步步带你用 Docker 搭建一个干净、可复用的 PHP 开发环境。
为什么选择 Docker 安装 PHP?
传统的 PHP 安装方式,比如通过 apt、brew 或直接编译,虽然可行,但容易带来“在我机器上能跑,到你机器上就报错”的问题。Docker 则完全不同——它把整个运行环境(包括 PHP、扩展、配置文件等)打包成一个独立的“盒子”,这个盒子可以在任何支持 Docker 的系统上运行,不依赖宿主机的配置。
想象一下,你开发一个项目,用的是 PHP 8.2 + MySQL 8.0 + Apache。通过 Docker 安装 PHP,你可以轻松地定义一个 docker-compose.yml 文件,把这三个服务都声明好,一键启动,完全不用手动配置任何依赖。
安装 Docker 环境
在开始之前,你需要先安装 Docker。如果你还没装,可以按以下步骤操作。
Linux 用户(Ubuntu/Debian)
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/pki/rpm-gpg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/pki/rpm-gpg/gpg-pubkey-d198920d.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/pki/rpm-gpg/gpg-pubkey-d198920d.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER
💡 注:如果提示“Docker 服务未启动”,运行
sudo systemctl enable docker和sudo systemctl start docker启动服务。
macOS 用户
前往 https://www.docker.com/products/docker-desktop 下载 Docker Desktop,安装完成后启动即可。
Windows 用户
同样下载 Docker Desktop,安装后在“设置”中启用 WSL2 支持(推荐),然后启动。
使用 Docker 安装 PHP 基础镜像
Docker 官方提供了多个 PHP 镜像,你可以在 Docker Hub 上查看。我们以 PHP 8.2 的 FPM 版本为例。
拉取 PHP 镜像
docker pull php:8.2-fpm
docker images
✅ 注释:
php:8.2-fpm是一个轻量级的 PHP 镜像,不包含 Apache 或 Nginx,适合作为后端服务运行。FPM 是 FastCGI Process Manager 的缩写,常用于和 Nginx 配合。
启动一个 PHP 容器测试
docker run -it --rm php:8.2-fpm bash
php -v
💡 注:
-it表示交互式运行(interactive),--rm表示容器退出后自动删除,适合临时测试。bash是进入容器的 Shell。
创建一个可复用的 PHP 项目环境
光能跑 PHP 是不够的,我们通常还需要扩展(如 PDO、MySQL、Redis)、配置文件和项目代码。这时,我们需要使用 Dockerfile 来构建一个自定义镜像。
创建项目目录结构
mkdir my-php-project
cd my-php-project
echo "<?php echo 'Hello from Docker!'; ?>" > index.php
编写 Dockerfile
FROM php:8.2-fpm
WORKDIR /var/www/html
RUN apt-get update && \
apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev \
libonig-dev \
unzip \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd pdo_mysql mysqli zip opcache
COPY . /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
✅ 注释:
FROM指定基础镜像。WORKDIR设置容器内的工作路径。RUN执行安装命令,-y自动确认,-j$(nproc)并行编译加快速度。docker-php-ext-configure配置 GD 扩展依赖。docker-php-ext-install安装扩展,opcache是性能优化的重要扩展。COPY . /var/www/html将当前目录文件复制进容器。EXPOSE声明端口,供外部访问。CMD指定容器启动时运行的命令。
构建镜像
docker build -t my-php-app .
docker images
✅ 注:
-t my-php-app给镜像打上标签,方便后续使用。
使用 Docker Compose 管理多服务环境
一个完整的 Web 项目通常包含 PHP 后端 + Nginx 前端 + MySQL 数据库。Docker Compose 能帮你轻松管理这些服务。
创建 docker-compose.yml
version: '3.8'
services:
# PHP-FPM 服务
php:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./:/var/www/html # 挂载本地代码
ports:
- "9000:9000" # 映射 PHP-FPM 端口
networks:
- app-network
# Nginx 服务
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./:/var/www/html
- ./nginx.conf:/etc/nginx/nginx.conf # 自定义 Nginx 配置
depends_on:
- php
networks:
- app-network
# MySQL 数据库
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db_data:
创建 Nginx 配置文件 nginx.conf
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
✅ 注:
fastcgi_pass php:9000表示将 PHP 请求转发给php服务的 9000 端口。
启动服务
docker-compose up -d
docker-compose ps
✅ 注:
-d表示后台运行。启动后访问http://localhost:8080,你应该能看到Hello from Docker!。
常见问题与解决
| 问题 | 解决方法 |
|---|---|
Permission denied |
确保 docker-compose.yml 文件权限正确,或使用 sudo |
| PHP 扩展未加载 | 检查 Dockerfile 中的 docker-php-ext-install 是否包含所需扩展 |
| Nginx 404 | 检查 nginx.conf 中 root 路径是否正确,且 index.php 存在 |
| MySQL 连接失败 | 检查 MYSQL_ROOT_PASSWORD 是否一致,或使用 docker exec 进入容器检查 |
结语
通过本文的一步步实践,你已经掌握了如何使用 Docker 安装 PHP,并构建一个完整的开发环境。从单个容器测试,到多服务协同,再到实际项目部署,Docker 让 PHP 开发变得高效、稳定、可复用。
无论你是初学者,还是已有项目需要环境统一,Docker 安装 PHP 都是一个值得投入时间掌握的技术。它不仅能避免“环境问题”,还能让你的开发流程更加标准化,提升团队协作效率。
记住:一个干净的容器,就是一个干净的开始。从今天起,让 Docker 为你保驾护航。