Docker 部署 PHP 全手冊
1. PHP 簡介
PHP 是最流行的后端腳本語言之一,廣泛應用于網站與 Web 應用開發。結合 Docker,可輕松實現“一鍵運行 PHP 環境”,避免復雜的系統配置。
核心特點
- 快速開發:語法簡單、上手快,擁有豐富框架(Laravel、ThinkPHP、WordPress 等)。
- 高兼容性:支持 Nginx、Apache、MySQL、Redis 等主流組件。
- 生態完善:Composer 管理依賴、擴展豐富(GD、PDO、mbstring 等)。
- 輕量可移植:通過 Docker 封裝環境,避免“本地能跑、服務器不行”的問題。
典型應用場景
| 場景類型 | 示例 | 適用用戶 |
|---|---|---|
| PHP 基礎學習 | 編寫 PHP 腳本、練習語法 | 新手 |
| Web 服務開發 | Laravel、ThinkPHP、WordPress | 中級 |
| 生產部署 | 企業級 API 服務、CMS 平臺 | 高級 |
官方資源
2. 部署前準備
在開始部署前,請確保本機具備以下環境。
2.1 硬件建議
| 資源類型 | 開發環境 | 生產環境 | 說明 |
|---|---|---|---|
| CPU | ≥ 2 核 | ≥ 4 核 | 多線程加快腳本執行速度 |
| 內存 | ≥ 2 GB | ≥ 8 GB | PHP + Web 服務需足夠內存 |
| 硬盤 | ≥ 10 GB | ≥ 50 GB | 建議使用 SSD 提升 IO 性能 |
2.2 軟件依賴
-
Docker:≥ 24.0.0
檢查版本:docker --version -
Docker Compose:≥ v2.26.1
檢查版本:docker compose version
2.3 一鍵安裝腳本
若你的系統尚未安裝 Docker,請先一鍵安裝:
Linux Docker & Docker Compose 一鍵安裝
一鍵安裝配置腳本(推薦方案):
該腳本支持多種 Linux 發行版,支持一鍵安裝 Docker、Docker Compose 并自動配置軒轅鏡像加速源。
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
2.4 網絡與安全
- 端口:PHP-FPM 默認不暴露端口,需配合 Nginx/Apache 映射。
- 鏡像加速:推薦使用 軒轅鏡像(避免國外鏡像拉取緩慢或失敗)。
3. 下載 PHP 鏡像
3.1 使用軒轅鏡像(推薦)
# 拉取 PHP 8.2 鏡像(含 FPM)
docker pull xxx.xuanyuan.run/library/php:8.2-fpm
# (可選)改名為標準官方名稱
docker tag xxx.xuanyuan.run/library/php:8.2-fpm php:8.2-fpm
docker rmi xxx.xuanyuan.run/library/php:8.2-fpm
3.2 使用官方鏡像(備用方案)
docker pull php:8.2-fpm
3.3 驗證鏡像是否下載成功
docker images
輸出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
php 8.2-fpm 5b437a0916a1 3 weeks ago 500MB
4. 快速上手:運行 PHP 環境
4.1 方式1:直接運行 PHP 容器(無網頁,僅命令行)
docker run -it --rm php:8.2-fpm php -v
輸出 PHP 版本信息即表示成功。
4.2 方式2:運行可訪問網頁的 PHP 環境(推薦)
步驟1:創建項目目錄
mkdir -p ~/php-demo/www
cd ~/php-demo/www
步驟2:編寫示例 PHP 文件
創建文件 index.php:
<?php
phpinfo();
?>
步驟3:創建 docker-compose.yml
version: "3.8"
services:
php:
image: php:8.2-fpm
container_name: php-fpm
volumes:
- ./www:/var/www/html
restart: unless-stopped
nginx:
image: nginx:latest
container_name: php-nginx
ports:
- "8080:80"
volumes:
- ./www:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
restart: unless-stopped
步驟4:創建 nginx.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$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
步驟5:啟動容器
docker compose up -d
步驟6:驗證運行結果
瀏覽器訪問:
http://localhost:8080
若出現 PHP 信息頁面(藍紫色表格),即部署成功 ??
5. 安裝擴展(如 pdo_mysql、gd、mbstring)
進入容器執行:
docker exec -it php-fpm bash
在容器內運行:
docker-php-ext-install pdo_mysql gd mbstring
安裝完成后重啟容器:
exit
docker compose restart php
驗證擴展是否啟用:
docker exec -it php-fpm php -m
輸出包含 pdo_mysql, gd, mbstring 即代表安裝成功。
6. 掛載項目目錄(讓代碼實時生效)
上文已將宿主機目錄 ./www 掛載到容器內 /var/www/html,因此:
- 修改本地
index.php后,無需重啟容器,刷新網頁即可看到效果; - 新建
test.php文件同樣會被自動加載。
7. 與數據庫聯動(PHP + MySQL)
7.1 修改 docker-compose.yml,新增 MySQL 服務
version: "3.8"
services:
php:
image: xxx.xuanyuan.run/php:8.2-fpm
container_name: php-fpm
volumes:
- ./www:/var/www/html
restart: unless-stopped
depends_on:
- mysql
nginx:
image: xxx.xuanyuan.run/nginx:latest
container_name: php-nginx
ports:
- "8080:80"
volumes:
- ./www:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
restart: unless-stopped
mysql:
image: xxx.xuanyuan.run/mysql:8.0
container_name: php-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: demo
MYSQL_USER: appuser
MYSQL_PASSWORD: app123
volumes:
- mysql-data:/var/lib/mysql
restart: unless-stopped
volumes:
mysql-data:
7.2 測試數據庫連接
創建 www/dbtest.php:
<?php
$dsn = 'mysql:host=mysql;dbname=demo;charset=utf8';
$user = 'appuser';
$pass = 'app123';
try {
$pdo = new PDO($dsn, $user, $pass);
echo "? 數據庫連接成功";
} catch (PDOException $e) {
echo "? 數據庫連接失敗:" . $e->getMessage();
}
?>
訪問:
http://localhost:8080/dbtest.php
若出現 “? 數據庫連接成功”,說明 PHP 與 MySQL 容器通信正常。
8. 生產部署建議
| 類別 | 建議配置 |
|---|---|
| 安全 | 不暴露 8080 端口至公網;通過 Nginx 反代 HTTPS;關閉 phpinfo 頁面 |
| 性能 | 啟用 OPcache:docker-php-ext-install opcache |
| 日志 | 將日志目錄掛載到宿主機(/var/log/nginx、/var/log/php) |
| 備份 | MySQL 定期 mysqldump 備份;PHP 代碼使用 Git 管理 |
| 監控 | 使用 docker stats 或 Prometheus 監控 CPU、內存、IO |
9. 常見問題排查
| 問題 | 原因 | 解決方法 |
|---|---|---|
| 網頁 502 Bad Gateway | PHP 容器未啟動 | 執行 docker ps 檢查 php-fpm 狀態 |
| PHP 文件被下載而非解析 | Nginx 未正確配置 fastcgi | 檢查 nginx.conf 中 fastcgi_pass php:9000 |
| 數據庫連接失敗 | 主機名寫錯 | 使用容器名 mysql 而非 localhost |
| 修改 PHP 文件無效 | 未掛載宿主目錄 | 檢查 volumes 是否設置正確 |
| PHP 擴展未生效 | 未重啟容器 | 運行 docker compose restart php |
10. 后續學習路徑
- 新手:學習 PHP 語法 → 用 Docker 跑 PHP+MySQL → 嘗試 WordPress/Laravel
- 進階者:研究 PHP-FPM 性能優化 → 使用 Supervisor 管理進程 → 部署 Nginx + PHP + Redis 架構
- 高級用戶:實現 CI/CD 自動化構建(GitHub Actions + Docker)→ 配置多環境(dev/staging/prod)
? 至此,你已成功用 Docker 構建出可運行的 PHP Web 環境。
該教程從 鏡像拉取 → PHP 環境運行 → 與 Nginx/MySQL 聯動 全流程覆蓋,新手照做即可跑通。

這篇教程詳細介紹了如何在 Docker 環境中部署 PHP,從鏡像拉取、容器啟動到文件掛載與端口映射,步驟清晰、示例完整,初學者照著操作即可快速搭建可運行的 PHP 開發環境。
浙公網安備 33010602011771號