如何在 Docker 容器中部署 Discuz X3.4 并持久化数据?

文章导读
在 Docker 中部署 Discuz X3.4 并持久化数据,最推荐的方式是使用 Docker Compose 编排 MySQL 和 PHP/Nginx 容器,并通过卷(Volume)映射将数据库文件和网站源码存储到宿主机目录。如果不配置卷映射,容器重启或删除后,论坛数据和附件会永久丢失。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Docker 中部署 Discuz X3.4 并持久化数据,最推荐的方式是使用 Docker Compose 编排 MySQL 和 PHP/Nginx 容器,并通过卷(Volume)映射将数据库文件和网站源码存储到宿主机目录。如果不配置卷映射,容器重启或删除后,论坛数据和附件会永久丢失。

先说结论:Discuz 部署必须绑定宿主机目录才能实现数据持久化,否则容器生命周期结束数据即消失。

  • 适合:需要频繁迁移、备份或避免环境污染的生产环境。
  • 先看:确认 Docker 和 Docker Compose 已安装,且宿主机有足够磁盘空间。
  • 建议:数据库数据卷和网站上传附件目录必须分别映射到本地路径。

命令速用版

以下 docker-compose.yml 配置示例展示了如何映射 MySQL 数据目录和 Discuz 源码目录,确保重启后数据不丢失。

version: "3"
services:
  db:
    image: mysql:5.7.31
    volumes:
      - "/home/discuz-data/mysql-data:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: your_password
  discuz_x:
    image: discuz:v3
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/home/discuz-data/upload/:/usr/share/nginx/html/"
      - "/home/discuz-data/config/:/etc/nginx/"
    depends_on:
      - db

为什么会这样

Docker 容器默认文件系统是临时的,容器删除后内部写入的数据会随之清除。Discuz 论坛的核心数据存储在 MySQL 数据库中,附件和图片存储在网站 upload 目录,这两处必须通过 Volume 或 Bind Mounting 映射到宿主机路径。公开资料中没有看到可靠的量化数据表明哪种存储驱动性能更好,但基于本地文件系统的 Volume 方案是社区最通用的持久化方案。

分步处理

第一步,准备宿主机目录结构。在服务器上创建用于存放数据和配置的主目录,例如 /home/discuz-data,并在其下建立 mysql-data、upload、config 等子目录。

如何在 Docker 容器中部署 Discuz X3.4 并持久化数据?

第二步,获取 Discuz 源码。下载 Discuz 安装包(如 Discuz_X3.4 或更新版本),解压后将 upload 目录内的文件放入宿主机映射的 upload 目录中,确保容器启动时能读取到源码。

第三步,编写配置文件。创建 docker-compose.yml 文件,定义 db 服务和 discuz 服务,重点检查 volumes 字段是否 correctly 指向了宿主机路径。

第四步,启动容器。在项目目录下运行 docker-compose up -d,等待容器状态变为 Up。

第五步,执行安装。浏览器访问服务器 IP,进入 Discuz 安装向导,数据库主机名填写 db 或容器服务名,密码填写 compose 文件中设置的环境变量。

怎么验证是否生效

运行 docker volume ls 命令,查看是否存在对应的数据卷名称。重启容器后,登录论坛后台发布新帖子或上传附件,再次重启容器,检查帖子和附件是否依然存在。如果数据还在,说明持久化配置生效。

如何在 Docker 容器中部署 Discuz X3.4 并持久化数据?

常见坑

文件权限问题最常见,容器内的 www-data 用户可能无权写入宿主机映射的目录,导致安装失败或无法上传附件,需在宿主机对映射目录执行 chmod -R 777 或 chown 调整权限。数据库连接错误常因容器网络未互通导致,确保 discuz 容器能解析 db 服务名。端口冲突也需注意,如果宿主机 80 端口被占用,需修改 compose 文件中的 ports 映射。

常见问题

容器重启后数据丢失怎么办?

检查 docker-compose.yml 中 volumes 配置是否缺失,确保 MySQL 的 /var/lib/mysql 和 Discuz 的 upload 目录已映射到宿主机。

Discuz 安装时提示数据库连接失败?

确认数据库主机名填写的是 docker-compose 中定义的服务名(如 db),而不是 localhost,且密码与环境变量一致。

可以使用哪些 Discuz 版本?

公开教程中常见 Discuz X3.4 和 X3.5 版本,部署方法基本一致,建议根据官方发布的最新安装包进行选择。

参考来源

  • Discuz Docker 容器生产级部署
  • Centos7 使用 docker 详细部署 discuz 社区网站
  • Docker 容器 lnmp 平台部署 discuz 论坛
  • docker 做持久化部署 docker 持久化存储