CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程

前言

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

安全建议

  1. 修改默认密码:安装完成后立即修改数据库和管理员密码
  2. 启用 HTTPS:配置 SSL 证书
  3. 定期备份:设置定时备份任务
  4. 限制后台访问:通过 Nginx 限制 admin.php 的访问 IP
  5. 更新系统:及时更新 Discuz 和依赖组件

总结

本文详细介绍了在 CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 的完整过程。通过 Docker 容器化部署,实现了环境隔离、快速部署和便捷管理。整个架构包含 Nginx 反向代理、Discuz 应用和 MySQL 数据库三个容器,通过 Docker 网络实现高效通信。

参考资料


注意:本文基于 CentOS 10 Stream 环境编写,实际部署时请根据服务器环境调整 IP 地址和端口配置。

相关推荐
张宇Joaquin1 小时前
openEuler编译和更换内核的方法
java·linux·服务器
小此方1 小时前
Re:Linux系统篇(五十六)线程篇 · 九:基于阻塞队列的生产者消费者模型与条件变量
linux·运维·服务器
迷途之人不知返1 小时前
自动化工程的构建
linux·自动化
三言老师11 小时前
秘诀-如何远程SSN访问家里的八台电脑(frp 实操方案)
linux·运维·ssh
举手12 小时前
Dispatcher模块剖析
linux·c++
BTU_YC12 小时前
Docker Compose 部署 DozerDB 完整教程
运维·docker·容器
allforgood13 小时前
运行容器
linux
Light_It14 小时前
Linux 内核参数 pci-stub.ids=
linux·kernel
RisunJan15 小时前
Linux命令-scriptreplay(终端会话回放)
linux·运维·chrome