前言
Discuz! X5.0 是基于 MitFrame 内核全新重构的社区论坛系统,全面拥抱 OAuth2.0 的 RESTful API 接口。本文将详细介绍如何在 CentOS 10 系统上使用 Docker Compose 部署最新版 Discuz X5.0 论坛。
环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | CentOS 10 Stream |
| Docker | 20.10+(本文使用 29.7.2) |
| Docker Compose | v2.0+(本文使用 v5.4.0) |
| PHP | 8.0+(容器内使用 8.1) |
| 数据库 | MySQL 8.0 |
架构设计
浏览器 → Nginx容器(80端口) → Discuz容器(PHP+Apache) → MySQL容器
三个容器通过 Docker 自定义网络 discuz_network 互相通信。
安装步骤
第一步:检查环境
bash
# 检查 Docker 版本
docker --version
# 检查 Docker Compose 版本
docker compose version
# 确保 Docker 服务正常运行
sudo systemctl status docker
第二步:创建项目目录结构
bash
# 创建项目主目录
mkdir -p ~/discuz-project/{discuz/html,nginx/conf.d,mysql/data}
# 进入项目目录
cd ~/discuz-project
第三步:下载 Discuz X5.0 源码
官方下载地址:https://www.discuz.vip/download
使用官方提供的下载脚本:
bash
# 创建临时下载目录
sudo mkdir -p /var/www/discuz
cd /var/www/discuz
# 下载并运行官方安装脚本
cd ~
if [ -f /usr/bin/curl ];then curl -sSLO https://download.discuz.vip/install/X5.0.sh;else wget -O X5.0.sh https://download.discuz.vip/install/X5.0.sh;fi;sudo bash X5.0.sh
# 脚本会询问域名绑定的目录,填写:/var/www/discuz
复制文件到项目目录:
bash
# 复制 Discuz 文件到项目目录
cd ~/discuz-project/discuz
sudo cp -r /var/www/discuz/* html/
# 设置权限
sudo chown -R $USER:$USER html/
chmod -R 755 html/
mkdir -p html/{config,data}
chmod -R 777 html/{config,data}
第四步:创建 Discuz 的 Dockerfile
bash
cd ~/discuz-project/discuz
cat > Dockerfile << 'EOF'
FROM php:8.1-apache
# 安装必要的 PHP 扩展
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libxml2-dev \
libzip-dev \
unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mysqli pdo pdo_mysql xml zip
# 启用 Apache 重写模块
RUN a2enmod rewrite
# 设置工作目录
WORKDIR /var/www/html
# 复制 Discuz 文件
COPY html/ /var/www/html/
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html \
&& chmod -R 777 /var/www/html/config /var/www/html/data
# 暴露端口
EXPOSE 80
# 启动 Apache
CMD ["apache2-foreground"]
EOF
第五步:创建 Nginx 配置
bash
mkdir -p ~/discuz-project/nginx/conf.d
cat > ~/discuz-project/nginx/conf.d/discuz.conf << 'EOF'
server {
listen 80;
server_name 192.168.6.102;# 此处修改成你自己的ip
access_log /var/log/nginx/discuz_access.log;
error_log /var/log/nginx/discuz_error.log;
location / {
proxy_pass http://discuz_app:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 20m;
}
# 静态文件处理
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://discuz_app:80;
proxy_set_header Host $host;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
EOF
第六步:创建 docker-compose.yml
bash
cd ~/discuz-project
cat > docker-compose.yml << 'EOF'
services:
mysql:
image: mysql:8.0
container_name: discuz_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: discuz
MYSQL_USER: discuz
MYSQL_PASSWORD: discuz123456
volumes:
- ./mysql/data:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password --max_allowed_packet=64M
networks:
- discuz_network
discuz:
build: ./discuz
container_name: discuz_app
restart: always
volumes:
- ./discuz/html:/var/www/html
depends_on:
- mysql
networks:
- discuz_network
nginx:
image: nginx:alpine
container_name: discuz_nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- discuz
networks:
- discuz_network
networks:
discuz_network:
driver: bridge
EOF
第七步:启动服务
bash
cd ~/discuz-project
# 构建并启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看启动日志
docker compose logs -f
第八步:完成安装
1. 访问安装向导
在浏览器打开:
http://192.168.6.102/install/
2. 填写数据库信息
数据库服务器地址: discuz_mysql
数据库名: discuz
数据库用户名: discuz
数据库密码: discuz123456
数据表前缀: pre_
系统信箱 Email: admin@admin.com
3. 填写管理员信息
管理员账号: admin
管理员密码: 设置强密码(至少8位)
重复密码: 再次输入
管理员 Email: admin@admin.com
4. 完成安装后
bash
# 删除安装目录(安全)
docker exec discuz_app rm -rf /var/www/html/install
# 设置正确权限
docker exec discuz_app chmod -R 755 /var/www/html
docker exec discuz_app chmod -R 777 /var/www/html/data
docker exec discuz_app chmod -R 777 /var/www/html/config
第九步:访问论坛
前台首页:http://192.168.6.102/
后台管理:http://192.168.6.102/admin.php
常见问题解决
1. 端口被占用
bash
# 查看 80 端口占用
ss -tuln | grep :80
# 停止占用进程或修改 docker-compose.yml 中的端口映射
2. 数据库连接失败
bash
# 测试容器间网络
docker exec discuz_app ping discuz_mysql
# 测试数据库连接
docker exec discuz_app php -r "
try {
\$pdo = new PDO('mysql:host=discuz_mysql;dbname=discuz', 'discuz', 'discuz123456');
echo '连接成功';
} catch (PDOException \$e) {
echo '连接失败: ' . \$e->getMessage();
}
"
3. 权限问题
bash
# 完全重置权限
cd ~/discuz-project/discuz
chmod -R 755 html/
mkdir -p html/{config,data}
chmod -R 777 html/{config,data}
docker restart discuz_app
4. 语言包缺失
如果出现 "language undefined" 错误,说明下载的国际版缺少中文语言包,需要使用官方脚本重新下载中文版。
日常管理命令
服务管理
bash
# 启动服务
docker compose up -d
# 停止服务
docker compose down
# 重启服务
docker compose restart
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f
数据备份
bash
# 备份数据库
docker exec discuz_mysql mysqldump -uroot -proot123456 discuz > ~/discuz_backup_$(date +%Y%m%d).sql
# 备份文件
tar -czf ~/discuz_files_backup_$(date +%Y%m%d).tar.gz ~/discuz-project/discuz/html/
更新 Discuz
bash
# 停止服务
docker compose down
# 备份当前文件
cp -r ~/discuz-project/discuz/html ~/discuz-project/discuz/html_backup
# 下载新版本替换 html 目录
# 重新构建并启动
docker compose up -d --build
安全建议
- 修改默认密码:安装完成后立即修改数据库和管理员密码
- 启用 HTTPS:配置 SSL 证书
- 定期备份:设置定时备份任务
- 限制后台访问:通过 Nginx 限制 admin.php 的访问 IP
- 更新系统:及时更新 Discuz 和依赖组件
总结
本文详细介绍了在 CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 的完整过程。通过 Docker 容器化部署,实现了环境隔离、快速部署和便捷管理。整个架构包含 Nginx 反向代理、Discuz 应用和 MySQL 数据库三个容器,通过 Docker 网络实现高效通信。
参考资料
注意:本文基于 CentOS 10 Stream 环境编写,实际部署时请根据服务器环境调整 IP 地址和端口配置。