Docker 安装 PHP(深入浅出)

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 dockersudo 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.confroot 路径是否正确,且 index.php 存在
MySQL 连接失败 检查 MYSQL_ROOT_PASSWORD 是否一致,或使用 docker exec 进入容器检查

结语

通过本文的一步步实践,你已经掌握了如何使用 Docker 安装 PHP,并构建一个完整的开发环境。从单个容器测试,到多服务协同,再到实际项目部署,Docker 让 PHP 开发变得高效、稳定、可复用。

无论你是初学者,还是已有项目需要环境统一,Docker 安装 PHP 都是一个值得投入时间掌握的技术。它不仅能避免“环境问题”,还能让你的开发流程更加标准化,提升团队协作效率。

记住:一个干净的容器,就是一个干净的开始。从今天起,让 Docker 为你保驾护航。