在 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 等子目录。
第二步,获取 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 命令,查看是否存在对应的数据卷名称。重启容器后,登录论坛后台发布新帖子或上传附件,再次重启容器,检查帖子和附件是否依然存在。如果数据还在,说明持久化配置生效。
常见坑
文件权限问题最常见,容器内的 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 持久化存储