用 Docker 部署 pbootCMS 时,最稳妥的方式是提前规划好网络、权限和数据持久化,避免容器启动后出现空白页或数据库连接失败。核心难点在于 PHP 扩展缺失、Nginx 转发配置错误以及容器间网络通信。
先说结论:pbootCMS 容器化部署的关键在于权限配置、容器网络互通和数据卷挂载,三者缺一不可。
- 适合:本地开发环境、测试环境、需要快速迁移的场景
- 先准备:Docker 和 Docker Compose 已安装,确认 PHP 和 MySQL 版本兼容
- 验收:首页能正常访问,后台可登录,/runtime/目录可写入
- 注意:必须自定义 PHP 镜像安装 PDO 扩展,Nginx 需正确配置 FastCGI
核心配置文件
以下是基于 docker-compose 的最小可用配置,包含 PHP 扩展安装和 Nginx 转发规则,可直接参考修改:
1. PHP Dockerfile(解决扩展缺失)
在項目目录下创建 php/Dockerfile,基础镜像需安装 pdo_mysql 扩展,否则无法连接数据库:
FROM php:7.4-fpm RUN docker-php-ext-install pdo_mysql mysqli WORKDIR /var/www/html
2. Docker Compose 配置
创建 docker-compose.yml,注意服务名为 mysql,数据库密码请修改为强密码:
version: '3'
services:
mysql:
image: mysql:5.7
container_name: pbootcms-mysql
environment:
MYSQL_ROOT_PASSWORD: YOUR_STRONG_PASSWORD
MYSQL_DATABASE: pbootcms
MYSQL_USER: pbootuser
MYSQL_PASSWORD: YOUR_STRONG_PASSWORD
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- pbootcms-network
php:
build: ./php
container_name: pbootcms-php
volumes:
- ./pbootcms:/var/www/html
- ./runtime:/var/www/html/runtime
networks:
- pbootcms-network
depends_on:
- mysql
nginx:
image: nginx:alpine
container_name: pbootcms-nginx
ports:
- "80:80"
volumes:
- ./pbootcms:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- pbootcms-network
depends_on:
- php
networks:
pbootcms-network:
driver: bridge3. Nginx 配置文件
创建 nginx.conf,确保 PHP 请求被转发到 php 容器的 9000 端口,否则会出现 502 错误或直接下载源码:
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$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}部署与配置步骤
第一步:准备项目目录结构
在服务器上创建项目目录,将 pbootCMS 源码放入其中,同时预留 runtime 目录:
mkdir -p /opt/pbootcms/{pbootcms,runtime,mysql-data,php}
cp -r pbootcms-source/* /opt/pbootcms/pbootcms/第二步:修正文件权限
容器内 PHP 通常以 www-data (UID 33) 运行。为避免权限错误,需在宿主机上将 runtime 目录授权给 UID 33:
cd /opt/pbootcms chown -R 33:33 ./runtime chmod -R 777 ./runtime
第三步:配置数据库连接
修改 pbootCMS 配置文件 config/config.php。在 Docker 网络中,DB_HOST 必须指向 Docker Compose 中的服务名 mysql,而不是 localhost:
'database' => [
'type' => 'mysql',
'host' => 'mysql',
'port' => 3306,
'user' => 'pbootuser',
'pass' => 'YOUR_STRONG_PASSWORD',
'name' => 'pbootcms'
],第四步:启动容器
在 docker-compose.yml 所在目录执行:
docker-compose up -d `--build`
怎么验证是否生效
部署完成后,按以下顺序检查:
- 检查容器状态:
docker ps,确认所有容器状态为 Up - 检查网络连通:
docker network inspect pbootcms-network,确认三个容器都在网络中 - 访问首页:
http://服务器 IP,页面应正常显示而非空白或 502 错误 - 检查 runtime 目录:
docker exec pbootcms-php ls -la /var/www/html/runtime,确认有缓存文件生成且所有者正确 - 查看日志:
docker logs pbootcms-nginx和docker logs pbootcms-php,排查报错信息
常见坑与安全建议
坑 1:PHP 扩展缺失
官方 php:fpm 镜像默认不包含 pdo_mysql 扩展。如果不通过 Dockerfile 安装,程序会报数据库连接类找不到错误。务必确认 Dockerfile 中执行了安装命令。
坑 2:Runtime 目录权限错误
常见错误是直接用 root 账号解压代码包,导致 runtime 目录所有者是 root,Web 服务进程无法写入。部署前务必确认 runtime 目录的所有者是 Web 服务器运行用户(容器内通常为 UID 33)。
坑 3:数据库连接配置错误
在 Docker 环境中,PHP 容器连接 MySQL 时应使用容器服务名(如 mysql),而不是 localhost 或 127.0.0.1。localhost 在容器内指向容器自身,而非其他容器。
坑 4:Nginx 配置不当
如果 Nginx 未配置 PHP 转发,访问 .php 文件会直接下载源码而不是执行。确保 fastcgi_pass 指向正确的 PHP 容器服务名和端口(php:9000)。
安全建议:弱密码风险
示例中的数据库密码仅为占位符。生产环境必须使用复杂密码(大小写字母 + 数字 + 符号,长度大于 12 位),并避免将密码硬编码在版本控制文件中,建议使用环境变量或 Docker Secret 管理。