易君召
发布于 2026-05-10 / 2 阅读
0
0

Docker Compose部署Discuz!X5保姆级实战教程

一、官方环境要求确认

根据 Discuz! X5.0 正式版官方说明:

  • PHP 版本:≥8.0,推荐 8.1-8.5(本方案使用 8.3 稳定版)

  • MySQL 版本:≥5.7,推荐 8.0(本方案使用 8.0 LTS)

  • 必需 PHP 扩展:mysqli、pdo_mysql、gd、curl、mbstring、zip、xml、json、opcache、redis

  • 数据库字符集:必须使用 utf8mb4(支持 emoji 和所有中文)

二、更新后的目录结构

/opt/discuz-x5/
├── docker-compose.yml    # 核心编排文件
├── Dockerfile-php        # 定制PHP镜像(含所有必需扩展)
├── nginx/
│   └── conf/
│       └── default.conf  # Discuz!专用Nginx配置
├── php/
│   └── conf/
│       └── php.ini       # PHP优化配置
├── mysql/
│   ├── data/             # MySQL数据持久化
│   └── conf/
│       └── my.cnf        # MySQL优化配置
└── www/                  # Discuz!源码目录

创建命令:

运行

mkdir -p /opt/discuz-x5 && cd /opt/discuz-x5
mkdir -p nginx/conf php/conf mysql/data mysql/conf www

三、更新后的配置文件

1. docker-compose.yml(核心文件)

services:
  # Nginx 1.25(稳定版,支持HTTP/3)
  nginx:
    image: nginx:1.25-alpine
    container_name: discuz-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/logs:/var/log/nginx
      - ./www:/var/www/html
    depends_on:
      - php
    networks:
      - discuz-net
    restart: always
    environment:
      TZ: Asia/Shanghai

  # PHP 8.3-fpm
  php:
    # 直接使用官方预构建的 PHP 8.3 镜像(已包含大部分扩展)
    image: php:8.3-fpm-alpine
    container_name: discuz-php
    volumes:
      - ./www:/var/www/html
      - ./php/conf:/usr/local/etc/php/conf.d
    networks:
      - discuz-net
    restart: always
    environment:
      TZ: Asia/Shanghai

  # MySQL 8.0(优化配置,utf8mb4默认字符集)
  mysql:
    image: mysql:8.0
    container_name: discuz-mysql
    ports:
      - "3306:3306"  # 如需本地工具连接可保留,生产环境建议注释
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: DiscuzRoot2026!  # 请务必修改!
      MYSQL_DATABASE: discuz_db             # 自动创建Discuz数据库
      MYSQL_USER: discuz_user               # 自动创建专用数据库用户
      MYSQL_PASSWORD: DiscuzUser2026!       # 请务必修改!
      TZ: Asia/Shanghai
    command: --default-authentication-plugin=mysql_native_password  # 兼容旧版PHP连接
    networks:
      - discuz-net
    restart: always

# 自定义隔离网络
networks:
  discuz-net:
    driver: bridge

2. Dockerfile-php(定制 PHP 镜像)

包含 Discuz! X5 所有必需扩展,无需后续手动安装:

dockerfile

FROM php:8.3-fpm-alpine

# 设置时区
RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai

# 安装系统依赖和PHP扩展
RUN apk add --no-cache \
    autoconf \
    g++ \
    make \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    libzip-dev \
    curl-dev \
    libxml2-dev \
    oniguruma-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) \
    mysqli \
    pdo_mysql \
    gd \
    curl \
    mbstring \
    zip \
    xml \
    json \
    opcache \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apk del autoconf g++ make \
    && rm -rf /tmp/pear /var/cache/apk/*

# 创建www-data用户(与Nginx用户一致)
RUN addgroup -g 82 -S www-data \
    && adduser -u 82 -D -S -G www-data www-data

# 设置工作目录
WORKDIR /var/www/html

3. nginx/conf/default.conf(Discuz! 专用配置)

内置完整伪静态规则和上传优化:

nginx

server {
    listen 80;
    server_name localhost;  # 安装完成后改为你的域名
    root /var/www/html;
    index index.php index.html index.htm;

    # 日志
    access_log /var/log/nginx/discuz.access.log;
    error_log /var/log/nginx/discuz.error.log;

    # 最大上传大小(与PHP配置一致)
    client_max_body_size 100M;

    # 静态资源缓存
    location ~* \.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
        expires 30d;
        access_log off;
    }

    location ~* \.(js|css)$ {
        expires 12h;
        access_log off;
    }

    # Discuz! 完整伪静态规则
    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?$1 last;
        }
    }

    # PHP解析配置
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # 超时设置
        fastcgi_connect_timeout 60s;
        fastcgi_send_timeout 60s;
        fastcgi_read_timeout 60s;
    }

    # 安全配置:禁止访问敏感文件
    location ~ /\. {
        deny all;
    }

    location ~* \.(sql|tar|gz|zip|rar|7z|bak)$ {
        deny all;
    }

    # 安装完成后请注释以下location块,禁止访问install目录
    # location ~ /install/ {
    #     allow all;
    # }
}

4. php/conf/php.ini(PHP 优化配置)

; 基础配置
date.timezone = Asia/Shanghai
memory_limit = 256M
max_execution_time = 60
max_input_time = 60

; 上传配置(与Nginx一致)
upload_max_filesize = 100M
post_max_size = 100M
max_file_uploads = 20

; 错误配置(生产环境改为Off)
display_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

; Opcache优化(大幅提升Discuz!性能)
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.save_comments = 1
opcache.fast_shutdown = 1

; 安全配置
expose_php = Off
allow_url_fopen = On
allow_url_include = Off

5. mysql/conf/my.cnf(MySQL 优化配置)

[mysqld]
# 字符集配置(必须,支持emoji)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 性能优化
max_allowed_packet = 64M  # 支持大附件上传
innodb_buffer_pool_size = 256M  # 建议设为服务器内存的50%-70%
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
#query_cache_type = 0  # MySQL8.0不可用
#query_cache_size = 0  # MySQL8.0不可用

# 兼容配置
# default-authentication-plugin = mysql_native_password  # MySQL8.0不可用
sql_mode = NO_ENGINE_SUBSTITUTION

[client]
default-character-set = utf8mb4

四、启动服务并安装 Discuz! X5

1. 构建并启动所有服务

运行

cd /opt/discuz-x5
sudo docker compose up -d --build

首次启动会自动构建 PHP 镜像并拉取其他镜像,耐心等待 1-2 分钟。

2. 下载 Discuz! X5 源码

运行

# 下载最新版Discuz! X5(官方Gitee仓库)
git clone https://gitee.com/Discuz/DiscuzX.git
cp -r DiscuzX/upload/* www/
rm -rf DiscuzX

3. 设置正确的目录权限

这是 Discuz! 安装成功的关键步骤

运行

# 设置文件属主为www-data(PHP运行用户)
chown -R 82:82 www/

# 设置必需目录的可写权限
chmod -R 755 www/
chmod -R 777 www/config/
chmod -R 777 www/data/
# chmod -R 777 www/uc_client/data/    #Discuz!X5没有该目录
# chmod -R 777 www/uc_server/data/    #Discuz!X5没有该目录

4. 开始安装 Discuz! X5

  1. 浏览器访问:http://你的服务器IP/install

  2. 按照安装向导操作,数据库信息填写:

    • 数据库服务器:mysql(容器名,无需填 IP)

    • 数据库名:discuz_db

    • 数据库用户名:discuz_user

    • 数据库密码:DiscuzUser2026!(你在 docker-compose.yml 中设置的)

    • 表前缀:默认pre_即可

  3. 安装完成后,立即执行安全操作

    运行

    # 删除安装目录
    rm -rf www/install/
    
    # 恢复config目录权限为只读
    chmod -R 755 www/config/
    

详细页面操作过程如下:

1.选择安装的语言

2.产品说明,开始安装

3.同意协议内容

4.检查安装环境

5.设置运行环境

6.创建数据库

7.安装完成

五、Discuz! X5 专属优化

1. 开启 Redis 缓存(大幅提升性能)

  1. docker-compose.yml中添加 Redis 服务:

    yaml

    redis:
      image: redis:7-alpine
      container_name: discuz-redis
      volumes:
        - ./redis/data:/data
      networks:
        - discuz-net
      restart: always
      environment:
        TZ: Asia/Shanghai
    
  2. 重启服务:docker-compose up -d

  3. 进入 Discuz! 后台 → 全局 → 性能优化 → 内存缓存,选择 Redis,服务器地址填redis:6379

2. 配置 HTTPS

  1. 将你的 SSL 证书文件放在nginx/conf/ssl/目录下

  2. 修改nginx/conf/default.conf,添加 HTTPS server 块:

    nginx

    server {
        listen 443 ssl http2;
        server_name yourdomain.com;
        root /var/www/html;
        index index.php index.html index.htm;
    
        ssl_certificate /etc/nginx/conf.d/ssl/yourdomain.crt;
        ssl_certificate_key /etc/nginx/conf.d/ssl/yourdomain.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
    
        # 其他配置与HTTP块相同
    }
    
    # HTTP自动跳转HTTPS
    server {
        listen 80;
        server_name yourdomain.com;
        return 301 https://$server_name$request_uri;
    }
    
  3. 重启 Nginx:docker compose restart nginx

六、常见问题排查

  1. 安装时提示目录不可写

    重新执行权限设置命令,确保www目录及其子目录的属主是82:82

  2. 数据库连接失败

    • 确认数据库服务器地址填的是mysql(容器名),不是localhost127.0.0.1

    • 确认docker-compose.yml中的数据库密码与安装时填写的一致

  3. 伪静态不生效

    确认 Nginx 配置文件中已添加完整的伪静态规则,并且重启了 Nginx 服务

  4. 上传大附件失败

    同时修改php.ininginx.conf中的upload_max_filesizeclient_max_body_size参数,保持一致

  5. Overlay2 存储驱动与ARM64服务器系统内核 / 架构严重不兼容

    修改修改 Docker 配置文件,强制使用 vfs 驱动

    # 创建或编辑 daemon.json
    sudo cat > /etc/docker/daemon.json << 'EOF'
    {
      "storage-driver": "vfs",
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      },
      "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com"
      ]
    }
    EOF
  6. 安装缺失的 PHP 扩展

    如果 Discuz! 安装时提示缺少 gdcurl 等扩展,我们再手动进入容器安装(用 Alpine 包管理器安装预编译的扩展,不自己编译):

    (1) 进入 PHP 容器

    运行

    sudo docker exec -it discuz-php sh
    

    (2)使用 Alpine 包管理器安装预编译扩展(更快更稳定)

    运行

    # 更新包索引
    apk update
    
    # 安装 Discuz! 必需的扩展(使用预编译包,不编译)
    apk add --no-cache \
      php83-gd \
      php83-curl \
      php83-mbstring \
      php83-zip \
      php83-mysqli \
      php83-pdo_mysql
    
    # 退出容器
    exit
    

    (3)重启 PHP 容器

    运行

    sudo docker compose restart php

七、常用维护命令

运行

# 查看服务状态
sudo docker ps

# 查看日志(如PHP错误)
sudo docker compose logs -f php

# 重启所有服务
sudo docker compose restart

# 停止并删除所有服务(保留数据)
sudo docker compose down

# 备份数据库
sudo docker exec discuz-mysql mysqldump -uroot -pDiscuzRoot2026! discuz_db > discuz_backup_$(date +%Y%m%d).sql

原文链接 https://www.yijunzhao.cn/archives/docker-composebu-shu-discuz-x5bao-mu-ji-shi-zhan-jiao-cheng

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/


评论