pbootCMS部署到Docker容器需要注意哪些配置?

文章导读
用 Docker 部署 pbootCMS 时,最稳妥的方式是提前规划好网络、权限和数据持久化,避免容器启动后出现空白页或数据库连接失败。核心难点在于 PHP 扩展缺失、Nginx 转发配置错误以及容器间网络通信。
📋 目录
  1. 核心配置文件
  2. 部署与配置步骤
  3. 怎么验证是否生效
  4. 常见坑与安全建议
A A

用 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: bridge

3. 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/

第二步:修正文件权限

pbootCMS部署到Docker容器需要注意哪些配置?

容器内 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`

怎么验证是否生效

部署完成后,按以下顺序检查:

  1. 检查容器状态:docker ps,确认所有容器状态为 Up
  2. 检查网络连通:docker network inspect pbootcms-network,确认三个容器都在网络中
  3. 访问首页:http://服务器 IP,页面应正常显示而非空白或 502 错误
  4. 检查 runtime 目录:docker exec pbootcms-php ls -la /var/www/html/runtime,确认有缓存文件生成且所有者正确
  5. 查看日志:docker logs pbootcms-nginxdocker logs pbootcms-php,排查报错信息

常见坑与安全建议

坑 1:PHP 扩展缺失

官方 php:fpm 镜像默认不包含 pdo_mysql 扩展。如果不通过 Dockerfile 安装,程序会报数据库连接类找不到错误。务必确认 Dockerfile 中执行了安装命令。

pbootCMS部署到Docker容器需要注意哪些配置?

坑 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 管理。