MyBB 1.8.41 Docker Compose 部署指南

MyBB 1.8.41 官方组织镜像 mybb/mybb 三服务编排(PHP-FPM + nginx 交叉挂载 + MariaDB 11.4)Docker Compose 从零部署:entrypoint 源码播种、十步安装向导 curl 非交互实测、admin 账号与 ACP 登录验证,含 413 请求体上限、单文件 bind mount inode 不刷新、ACP 路径误区等排障实录,基于 Ubuntu 24.04.5 + Docker 29.9.2 全量实测。

MyBBMyBBDockerDocker ComposeMariaDBnginx论坛2026/11/02

MyBB 1.8.41 Docker Compose 部署指南

目标:用 MyBB 官方组织镜像 mybb/mybb:1.8.41 以 Docker Compose 从零部署一套自托管 MyBB 论坛:三服务编排(mybb PHP-FPM + nginx 反代交叉挂载 + MariaDB 11.4)、entrypoint 自动播种源码、十步安装向导以 curl 非交互等价跑通、管理员账号创建与 ACP 登录验证,并完整沉淀 413 请求体上限、单文件 bind mount inode 不刷新、ACP 路径误区等排障实录。已在 Ubuntu 24.04.5 LTS + Docker 29.9.2 + Compose v5.6.1 环境全量实测通过,文中所有命令与回显均为实测原文。

一、环境信息

本文所有命令与输出均在以下环境实测采集:

  • 操作系统:Ubuntu 24.04.5 LTS(x86_64,kernel 7.0.0-38-generic)
  • Docker:29.9.2(含 Docker Compose v5.6.1 插件)
  • MyBB:1.8.41(GitHub tag mybb_1841,2026-09-16 发布;官方组织镜像 mybb/mybb:1.8.41,Docker Hub 2026-10-23 更新,186,664 次拉取)
  • 应用运行时:PHP 8.2.35(php:8.2-fpm-alpine 基底)+ mysqli / pdo_mysql / pgsql / pdo_pgsql / gd / Zend OPcache / igbinary / memcached / redis
  • 数据库:MariaDB 11.4.13(mariadb:11.4)
  • 反向代理:nginx 1.27.5(nginx:1.27-alpine)
  • 部署目录:/opt/mybb(本文示例路径;实测宿主目录为 /opt/data/quzuo/tmp/mybb/compose,compose 内挂载全部为 ./ 相对路径,不影响回显内容)
  • 站点地址:http://127.0.0.1:8144/(端口槽位 8143/8147 被宿主 IDE 进程占用,改用同段 8144,见 3.2 与 11.4)
  • 管理员账号:admin / q1w2e3r4(演示口令;ACP 二次 PIN 1234)
  • 数据库账号:库/用户/口令 mybb / mybb / q1w2e3r4,root 口令 q1w2e3r4;3306 不对外发布,仅内网访问
  • 自定义网络:mybb_mybbnet(子网 10.89.68.0/24,网关 10.89.68.1;静态 IP:db 10.89.68.10、mybb 10.89.68.11、web 10.89.68.12)
  • 三服务常驻内存实测(安装完成并浏览若干页面后采样,docker stats --no-stream):
服务内存占用说明
mybb-db95MiBMariaDB 11.4(75 张表)
mybb-app53.21MiBPHP-FPM 8.2(MyBB 本体)
mybb-web13.34MiBnginx 反代 + 静态文件
合计约 161MiB1GB 内存宿主即可轻松运行

二、镜像选型说明

官方文档站 docs.mybb.com 不提供 Docker 部署路径——实查 https://docs.mybb.com/1.8/install/(2026-11-02),官方安装文档只有「下载 zip → 上传 Upload/ 目录 → 改名 .htaccess → 浏览器安装向导」,全页无 "docker" 字样。但 MyBB 组织在 Docker Hub 发布官方组织镜像 mybb/mybb:源仓库 mybb/docker(描述即 "The official Dockerfile for the MyBB forum software",master 分支,63 stars,2026-09-16 推送),tag latest / 1.8 / 1.8.41 均于 2026-10-23 更新,与 GitHub 发版同步。

本栈使用的部署仓库:

镜像来源本实测 tag体积(实测)用途
mybb/mybb:1.8.41MyBB 官方组织(基于 php:8.2-fpm-alpine)1.8.41159MBPHP-FPM 应用(MyBB 源码内置镜像)
nginx:1.27-alpineDocker Hub 官方1.27.574.5MB反代 + 静态文件服务
mariadb:11.4MariaDB 官方11.4.13455MB数据库

mybb/mybb 内部结构(逐行读 mybb/docker 仓库 Dockerfile 与 docker-entrypoint.sh,2026-11-02 实查):

  • 基础 php:8.2-fpm-alpine,编译安装扩展 gd(freetype/jpeg/webp)、mysqli、opcache、pdo_mysql、pdo_pgsql、pgsql,PECL 装 igbinary-3.2.16、memcached-3.4.0、redis-6.3.0;
  • 内置三份 PHP 配置:opcache-recommended.ini(OPcache 128MB)、error-logging.ini(错误进 stderr、display_errors=Off)、mybb-recommended.ini(upload_max_filesize=10M / post_max_size=10M / memory_limit=256M / max_execution_time=20);
  • 构建期从 GitHub 下载 mybb/mybb 源码包 tag mybb_1841 的 tarball,sha512 校验后解到 /usr/src/mybb-mybb_1841;
  • docker-entrypoint.sh:启动时检查当前目录(/var/www/html)是否已有 index.php 与 inc/class_core.php,没有则把 /usr/src 源码 tar 管道进挂载目录(首次「播种」);支持 --skip-old-files 参数在播种时保留已有文件;
  • CMD ["php-fpm"]——只提供 FastCGI,不能直接服务静态文件。官方 README 明确要求与 nginx 共享同一份 /var/www/html(交叉挂载)。

社区镜像对照(Docker Hub 搜索,2026-11-02 实查):

仓库拉取量状态
mybb/mybb186,664官方组织,tag 随版本发布同步(1.8.41,2026-10-23)
fbmac/mybb25,083社区单体打包(Apache+MyBB 合一),多年未更新
mariomarin/mybb 等<2,000个人打包(含 confd 模板),维护弱

💡 技术拓展:论坛类软件的容器交付形态主要有三类——

形态代表取舍
官方组织预构建镜像 + 版本 tagMyBB(mybb/mybb)、Grafana拉取即用、升级改 tag;代码内置在镜像里,挂载目录承载可写数据
官方部署包本地构建Misago(misago_docker)应用与编排同仓库演进;首次构建耗时
无官方容器化、社区 compose 文件phpBB灵活但质量参差,供应链风险自担

MyBB 属第一类且官方路径清晰(组织镜像 + README 官方 compose 示例),本文即按官方路径部署。

⚠️ 网络说明:本实测环境直连 hub.docker.com API 超时(curl exit 28),三个部署仓库均经 docker daemon 的 registry-mirrors(docker.m.daocloud.io 等三加速源)拉取成功;raw.githubusercontent.com 直连超时,README/Dockerfile 经代理 192.168.1.72:7897 与 GitHub API(api.github.com 直连可通)获取。若你的服务器可直连 Docker Hub / GitHub,无需任何额外配置。

三、前置条件

3.1 Docker 与 Compose 插件

宿主机需 Docker 24+ 与 docker compose v2+ 插件。验证:

docker --version && docker compose version

实测回显:

Docker version 29.9.2, build a82e528
Docker Compose version v5.6.1

3.2 端口规划

官方 README 示例发布 8080;本实测宿主规划 8143-8147 段,但 8143/8147 已被 IDE 进程占用:

ss -tlnp | grep -E ':(814[3-7])\b'

实测回显:

LISTEN 0      511        127.0.0.1:8147   0.0.0.0:*   users:(("trae-cn",pid=5775,fd=61))
LISTEN 0      511        127.0.0.1:8143   0.0.0.0:*   users:(("trae-cn",pid=5775,fd=64))

故本栈 web 对外发布 8144(ss -tlnp | grep ':8144' 规划时无输出 = 空闲)。MariaDB 3306 与 PHP-FPM 9000 均留在自定义网络内,不发布宿主端口。

3.3 网段规划

多栈共存建议显式声明子网,避免自动分配冲突。检查空闲:

ip route | grep '10.89.68'

实测回显:无输出(= 10.89.68.0/24 空闲,本栈独占,见 4.1 networks 段)。

3.4 资源与目录结构

三个部署仓库合计约 689MB,常驻内存约 161MiB(第一章实测表),建议 ≥1GB 内存、≥4GB 磁盘空闲。建目录:

mkdir -p /opt/mybb/{nginx,mybb,data/db}
  • mybb/:Web 根(bind mount,同时挂给 mybb 与 web 两个服务);
  • data/db/:MariaDB 数据目录;
  • nginx/:vhost 配置文件。

四、部署步骤

4.1 编排文件 docker-compose.yml

name: mybb

networks:
  mybbnet:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.68.0/24
          gateway: 10.89.68.1

services:
  db:
    image: mariadb:11.4
    container_name: mybb-db
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: q1w2e3r4
      MARIADB_DATABASE: mybb
      MARIADB_USER: mybb
      MARIADB_PASSWORD: q1w2e3r4
    volumes:
      - ./data/db:/var/lib/mysql
    networks:
      mybbnet:
        ipv4_address: 10.89.68.10
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 12

  mybb:
    image: mybb/mybb:1.8.41
    container_name: mybb-app
    restart: unless-stopped
    volumes:
      - ./mybb:/var/www/html
    networks:
      mybbnet:
        ipv4_address: 10.89.68.11
    depends_on:
      db:
        condition: service_healthy

  web:
    image: nginx:1.27-alpine
    container_name: mybb-web
    restart: unless-stopped
    ports:
      - "8144:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./mybb:/var/www/html:ro
    networks:
      mybbnet:
        ipv4_address: 10.89.68.12
    depends_on:
      - mybb

关键项逐项说明:

  • name: mybb:项目名,决定网络实际名 mybb_mybbnet;
  • db:MARIADB_DATABASE/USER/PASSWORD 在首次初始化时预建库与业务账号,安装向导直接连用;healthcheck 用镜像自带 healthcheck.sh --connect --innodb_initialized,mybb 服务以 condition: service_healthy 把关,避免 FPM 起来时数据库尚未就绪;
  • mybb:只挂 ./mybb:/var/www/html(读写)——entrypoint 把镜像内源码播种到这里。没有环境变量:MyBB 不读 env 配置,全部配置由安装向导写入 inc/config.php(见 7.1);
  • web:两个挂载是本编排的精髓——vhost 单文件只读挂载 + ./mybb 交叉挂载(只读)。PHP-FPM 不服务静态文件,nginx 必须与应用看到同一份 Web 根(官方 README 原文:"static content such as images and JavaScript or CSS files must be cross-mounted between the mybb and nginx containers");
  • 静态 IP 便于巡检对照(4.4 验证),非必需项。

语法校验:

cd /opt/mybb && docker compose config --quiet && echo "config OK"

实测回显:

config OK

4.2 nginx vhost(官方 gist 基线 + 上传上限修正)

官方 README 给出最小 vhost 示例(gist)。本文以它为基线,新增一行 client_max_body_size 10m(原因:nginx 默认 1MB 请求体上限与镜像内 PHP 10M 上传限制冲突,实测 413,排障见 11.1):

upstream mybb {
    server mybb:9000 weight=5;
}

server {
    listen 80;

    client_max_body_size 10m;

    root /var/www/html;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ inc/ {
        internal;
    }

    location ~ ^/(images|cache|jscripts|uploads)/ {
        access_log off;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass mybb;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
  • upstream mybb → server mybb:9000:服务名 DNS 解析到 10.89.68.11,PHP-FPM 监听 9000;
  • try_files $uri $uri/ /index.php?$args:MyBB 以根目录 PHP 文件为入口路由,未命中文件回落到 index.php;
  • location ~ inc/ { internal; }:禁止 HTTP 直接访问一切含 inc/ 的路径(内部类库与含数据库口令的 inc/config.php)——实测 GET /inc/config.php 返回 404(见 4.6)。注意 ACP 不在 inc/ 下,而在 Web 根 admin/(误区见 11.3);
  • \.php$ 段把所有 PHP 执行转给 mybb 服务,nginx 只做转发与静态文件。

4.3 拉取三个部署仓库

docker pull mybb/mybb:1.8.41

实测回显(输出节选,实测尾部):

bd719ff44aed: Pull complete
8d94d31226df: Pull complete
Digest: sha256:eabb3c487598d8e64e44bc51282190b8187d468e2ae77a11344035a083acaad4
Status: Downloaded newer image for mybb/mybb:1.8.41
docker.io/mybb/mybb:1.8.41
docker pull nginx:1.27-alpine && docker pull mariadb:11.4

实测回显(各取尾部两行):

Status: Downloaded newer image for nginx:1.27-alpine
docker.io/library/nginx:1.27-alpine
Status: Downloaded newer image for mariadb:11.4
docker.io/library/mariadb:11.4

⚠️ 网络说明:本实测直连 hub.docker.com 失败,以上均经 daemon registry-mirrors 加速拉取成功(见第二章网络说明)。

4.4 启动与播种、网络验证

cd /opt/mybb && docker compose up -d

实测回显:

 Network mybb_mybbnet Created 
 Container mybb-db Creating 
 Container mybb-db Created 
 Container mybb-app Creating 
 Container mybb-app Created 
 Container mybb-web Creating 
 Container mybb-web Created 
 Container mybb-db Starting 
 Container mybb-db Started 
 Container mybb-db Waiting 
 Container mybb-db Healthy 
 Container mybb-app Starting 
 Container mybb-app Started 
 Container mybb-web Starting 
 Container mybb-web Started 

mybb-db Waiting → Healthy 即 healthcheck 把关生效:数据库就绪后应用才启动。

三服务与端口发布状态:

docker compose ps

实测回显:

NAME       IMAGE               COMMAND                  SERVICE   CREATED          STATUS                    PORTS
mybb-app   mybb/mybb:1.8.41    "docker-entrypoint.s…"   mybb      29 seconds ago   Up 18 seconds             9000/tcp
mybb-db    mariadb:11.4        "docker-entrypoint.s…"   db        30 seconds ago   Up 29 seconds (healthy)   3306/tcp
mybb-web   nginx:1.27-alpine   "/docker-entrypoint.…"   web       29 seconds ago   Up 18 seconds             0.0.0.0:8144->80/tcp, [::]:8144->80/tcp

静态 IP 按规划落位:

docker network inspect mybb_mybbnet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}
{{end}}'

实测回显:

mybb-web 10.89.68.12/24
mybb-db 10.89.68.10/24
mybb-app 10.89.68.11/24

entrypoint 首次播种验证(启动前 ./mybb/ 为空目录):

docker compose logs mybb

实测回显(输出节选,实测头部):

mybb-app  | MyBB not found in /var/www/html - copying now...
mybb-app  | Complete! MyBB 1841 has been successfully copied to /var/www/html
mybb-app  | [02-Nov-2026 07:48:11] NOTICE: fpm is running, pid 1
mybb-app  | [02-Nov-2026 07:48:11] NOTICE: ready to handle connections

MyBB 1841 即镜像内置版本号(tag mybb_1841 → MyBB 1.8.41)。播种完成后宿主 ./mybb/ 已是完整发行源码:

ls /opt/mybb/mybb/ | head

实测回显(头部节选):

admin
announcements.php
archive
attachment.php
cache
calendar.php
captcha.php
contact.php
css.php
editpost.php

4.5 安装向导(十步,浏览器步骤与 curl 非交互等价)

MyBB 官方安装方式是浏览器访问 /install/index.php 走完十步向导:Welcome → License Agreement → Requirements Check → Database Configuration → Table Creation → Data Insertion → Theme Installation → Board Configuration → Administrator User → Finish Setup。本章实测证明该向导纯表单 POST、无 JS 门槛,给出 curl 非交互等价流程(适合自动化部署与排障复现);浏览器操作按同一顺序点 Next 即可。

向导入口可达(站点根此时 302 跳安装页,见 4.4 日志):

curl -s -I http://127.0.0.1:8144/install/index.php | head -3

实测回显:

HTTP/1.1 200 OK
Server: nginx/1.27.5
Date: Mon, 02 Nov 2026 07:48:44 GMT

前三步(欢迎/许可/需求检查)依次提交:

curl -s -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=license&allow_anonymous_info=1"
curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=requirements_check"
curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=database_info"

实测回显(Requirements Check 页关键文本,节选):

PHP Version: 8.2.35 Supported DB Extensions: MySQL Improved, PostgreSQL, SQLite 3, PostgreSQL (PDO), MySQL (PDO) Supported Translation Extensions: Multi-Byte, iconv PHP XML Extensions: Installed Configuration File Writable: Writable Settings File Writable: Writable Cache Directory Writable: Writable ... Congratulations, you meet the requirements to run MyBB.

Database Configuration 页提供 5 种引擎(dbengine 下拉:mysqli / pgsql / sqlite / pgsql_pdo / mysql_pdo),每种一组 config[<引擎>][dbhost|dbuser|dbpass|dbname|tableprefix|encoding] 字段。本文选 MySQLi 连同栈 db 服务、utf8mb4 编码,提交后向导直接建表:

curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" \
  --data "action=create_tables" \
  --data "dbengine=mysqli" \
  --data-urlencode "config[mysqli][dbhost]=db" \
  --data-urlencode "config[mysqli][dbuser]=mybb" \
  --data-urlencode "config[mysqli][dbpass]=q1w2e3r4" \
  --data-urlencode "config[mysqli][dbname]=mybb" \
  --data-urlencode "config[mysqli][tableprefix]=mybb_" \
  --data-urlencode "config[mysqli][encoding]=utf8mb4"

实测回显(Table Creation 页,输出节选实测首尾):

Connection to the database server and database you specified was successful. Database Engine: MySQLi 11.4.13
The MyBB database tables will now be created. Creating table mybb_adminlog...done Creating table mybb_adminoptions...done ... Creating table mybb_warnings...done All tables have been created, click Next to populate them.

💡 技术拓展:MyBB 支持的数据库引擎有 5 种形态——

引擎说明适用
mysqli原生 MySQL/MariaDB 扩展传统部署,MariaDB 首选(本文)
mysql_pdoPDO 封装 MySQL需要统一 PDO 接口
pgsql / pgsql_pdoPostgreSQLPG 站点(官方 README compose 示例即用 postgres)
sqlite文件库仅小规模测试,官方不建议生产

本文用 mysqli 连同栈 MariaDB 11.4.13;镜像五种扩展全内置,换引擎无需更换部署仓库。

随后三步(默认数据填充 → 主题模板导入 → 取站点配置表单):

curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=populate_tables"
curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=templates"
curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" --data "action=configuration"

实测回显(两页关键文本):

Table Population ... The default data has successfully been inserted into the database.
Theme Insertion Loading and importing theme and template file... The default theme and template sets have been successfully inserted.

Board Configuration 页字段:bbname、bburl(自动探测为 http://127.0.0.1:8144)、websitename、websiteurl、cookiedomain、cookiepath、contactemail、pin(ACP 二次验证 PIN)。提交:

curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" \
  --data "action=adminuser" \
  --data-urlencode "bbname=MyBB 演示论坛" \
  --data-urlencode "bburl=http://127.0.0.1:8144" \
  --data-urlencode "websitename=MyBB 演示站点" \
  --data-urlencode "websiteurl=http://127.0.0.1:8144/" \
  --data-urlencode "cookiedomain=" \
  --data-urlencode "cookiepath=/" \
  --data-urlencode "contactemail=admin@example.com" \
  --data "pin=1234"

Create Administrator Account 页字段 adminuser / adminpass / adminpass2 / adminemail,提交即完成:

curl -s -b cookies.txt -c cookies.txt -X POST "http://127.0.0.1:8144/install/index.php" \
  --data "action=final" \
  --data "adminuser=admin" \
  --data "adminpass=q1w2e3r4" \
  --data "adminpass2=q1w2e3r4" \
  --data "adminemail=admin@example.com"

实测回显(Finish Setup 页,节选):

Importing user groups...done Creating Administrator account...done Building Administrator permissions...done Building data caches...done Your copy of MyBB has successfully been installed and configured correctly. ... Your installer has been locked. To unlock the installer please delete the 'lock' file in this directory.

注意末句:向导完成后自动写入 install/lock 防止二次安装(4.6 实测复核)。

4.6 安装后验证

前台站点:

curl -s -o /dev/null -w 'GET / -> HTTP %{http_code}\n' http://127.0.0.1:8144/
curl -s http://127.0.0.1:8144/ | grep -o '<title>[^<]*</title>'

实测回显:

GET / -> HTTP 200
<title>MyBB 演示论坛</title>

向导写出的 inc/config.php(宿主侧 bind mount 即可见,属主为镜像内 www-data 的 uid/gid 82):

sed -n '9,16p' /opt/mybb/mybb/inc/config.php && ls -l /opt/mybb/mybb/inc/config.php /opt/mybb/mybb/install/lock

实测回显:

$config['database']['type'] = 'mysqli';
$config['database']['database'] = 'mybb';
$config['database']['table_prefix'] = 'mybb_';

$config['database']['hostname'] = 'db';
$config['database']['username'] = 'mybb';
$config['database']['password'] = 'q1w2e3r4';
-rw-rw-r-- 1 82 82 4235 Nov  2 15:50 /opt/mybb/mybb/inc/config.php
-rw-r--r-- 1 82 82    1 Nov  2 15:50 /opt/mybb/mybb/install/lock

(hostname=db 即 compose 服务名 DNS,见 7.1。)

数据库侧(75 张表、管理员、站点设置):

docker exec mybb-db mariadb -umybb -pq1w2e3r4 mybb -e "SHOW TABLES" | tail -n +2 | wc -l
docker exec mybb-db mariadb -umybb -pq1w2e3r4 mybb -e "SELECT username,email,usergroup FROM mybb_users; SELECT value FROM mybb_settings WHERE name IN ('bbname','bburl')"

实测回显:

75
username  email               usergroup
admin     admin@example.com   4
value
MyBB 演示论坛
http://127.0.0.1:8144

(usergroup=4 即 Administrator 组。)

ACP 登录(真实账号 + PIN,do=login):

curl -s -c acp_cookies.txt -X POST http://127.0.0.1:8144/admin/index.php \
  -d "username=admin&password=q1w2e3r4&pin=1234&do=login" -o /dev/null -w 'POST login -> HTTP %{http_code}\n'
curl -sL -b acp_cookies.txt http://127.0.0.1:8144/admin/index.php | grep -o '<title>[^<]*</title>'

实测回显:

POST login -> HTTP 200
<title>Dashboard</title>

安全与锁定复核:

curl -s -o /dev/null -w 'GET /inc/config.php -> HTTP %{http_code}\n' http://127.0.0.1:8144/inc/config.php
curl -s http://127.0.0.1:8144/install/index.php | grep -o "The installer is currently locked[^<]*"

实测回显:

GET /inc/config.php -> HTTP 404
The installer is currently locked, please remove 'lock' from the install directory to continue

五、数据持久化说明

本栈不使用命名卷,全部持久化面是两个 bind mount:

宿主路径挂载点挂载方内容
./mybb//var/www/htmlmybb(rw)+ web(ro)应用代码、inc/config.php、uploads/(附件/头像/签名)、cache/(数据缓存);ACP 首次数据库备份会再建 backupdb/
./data/db//var/lib/mysqldb(rw)MariaDB 数据文件(75 张表的物理存储)

MyBB 的代码与用户数据同在一个 Web 根(单目录部署传统),备份要同时覆盖文件侧(uploads/、inc/config.php)与数据库侧(./data/db 或 SQL dump;具体命令见 《MyBB 1.8.41 常用运维命令与排障详解》)。

持久化实测(整栈拆除重建):

docker compose down && docker compose up -d

实测回显(down 尾部 + 重建后验证,输出节选):

 Container mybb-db Removing 
 Container mybb-db Removed 
 Network mybb_mybbnet Removing 
 Network mybb_mybbnet Removed 
 Container mybb-db Waiting 
 Container mybb-db Healthy 
 Container mybb-app Starting 
 Container mybb-app Started 
 Container mybb-web Starting 
 Container mybb-web Started
GET / -> HTTP 200
<title>MyBB 演示论坛</title>

重建后站点名仍是「MyBB 演示论坛」、无需重跑向导——因为 index.php 与 inc/class_core.php 存在,entrypoint 播种逻辑直接跳过,既不覆盖 inc/config.php 也不重复铺源码(播种条件见第二章 Dockerfile 解读)。

六、环境变量表

服务变量实测值说明
dbMARIADB_ROOT_PASSWORDq1w2e3r4root 口令(演示)
dbMARIADB_DATABASEmybb首启预建库,向导直接连用
dbMARIADB_USERmybb首启预建业务账号
dbMARIADB_PASSWORDq1w2e3r4业务账号口令
mybb(无)—MyBB 不读 env 配置;配置在 inc/config.php(向导写)与 mybb_settings 表(ACP 管理)
web(无)—vhost 走文件挂载,无 env 注入

⚠️ 注意:改 MARIADB_* 环境变量不会改数据库口令——./data/db 非空时 MariaDB 镜像跳过初始化(env 只在空目录首启生效)。改口令需 SQL ALTER USER 并同步改 inc/config.php(操作见运维篇)。

mybb 服务另有命令行参数(非环境变量):command: --skip-old-files php-fpm——仅在播种阶段生效,铺源码时保留挂载目录已有文件(官方 README "Preserving existing files" 用法,升级场景见第十章)。

七、配置参数说明

7.1 inc/config.php(文件级配置,向导生成)

向导把文件级配置全量写入 inc/config.php(实测 4235 字节)。实测存在的配置键全集(grep 提取):

$config['database']['type'] / ['database'] / ['hostname'] / ['username'] / ['password'] / ['table_prefix'] / ['encoding']
$config['admin_dir']
$config['hide_admin_links']
$config['secret_pin']
$config['super_admins']
$config['cache_store']
$config['memcache']['host'] / ['port']
$config['redis']['host'] / ['port']
$config['log_pruning']
$config['disallowed_remote_hosts'] / ['disallowed_remote_addresses']

要点:

  • database.hostname 在容器形态下必须写 compose 服务名 db(或静态 IP 10.89.68.10),不能写 localhost——mybb 服务里的 localhost 是它自己;
  • admin_dir:ACP 目录名(默认 admin),生产第一步加固就是改成生僻值并同步 vhost(见 11.3);
  • secret_pin:4.5 设置的 ACP PIN 的散列存储;super_admins:免 PIN 的管理员 ID 白名单;
  • cache_store + memcache/redis 段:镜像已内置 redis/memcached 扩展,接入缓存服务可把数据缓存搬出 MySQL(配置详解见 《MyBB 1.8.41 配置参数详解》)。

7.2 PHP 运行时配置(镜像内置三份 ini)

ini 文件关键参数实测效果
opcache-recommended.iniopcache.memory_consumption=128、max_accelerated_files=4000、revalidate_freq=2字节码缓存 128MB;改代码最长 2 秒生效
error-logging.inidisplay_errors=Off、log_errors=On、error_log=/dev/stderr报错进服务日志(docker compose logs mybb),不外泄到页面
mybb-recommended.iniupload_max_filesize=10M、post_max_size=10M、memory_limit=256M、max_execution_time=20附件/头像上限 10M——nginx 侧需 client_max_body_size 10m 对齐(否则 413,见 11.1)

三份 ini 位于容器 /usr/local/etc/php/conf.d/。要改参数不必重做部署仓库:把自己的 ini 挂进去覆盖即可,如 - ./php/upload.ini:/usr/local/etc/php/conf.d/zz-upload.ini:ro。

7.3 ACP settings(数据库级配置)

站点名、注册开关、邮件、缓存策略等数百项设置存于 mybb_settings 表,在 ACP「配置 → 设置」管理。实测写回示例:4.5 向导提交的 bbname=MyBB 演示论坛 可直接查表验证(见 4.6 回显)。设置缓存重建与逐项参数见 《MyBB 1.8.41 配置参数详解》。

八、配置文件挂载

本栈三类挂载,各有注意事项:

  1. 单文件 ro 挂载(./nginx/default.conf → /etc/nginx/conf.d/default.conf:ro):改配置后 docker exec mybb-web nginx -s reload 或 docker compose restart web 生效;但若宿主编辑工具替换了文件 inode(sed -i、vim 默认写临时文件再改名等),容器仍持有旧 inode 内容,reload 也读不到新配置——必须 docker compose up -d --force-recreate web 重建才刷新(完整排障实录见 11.2)。规避:按官方 README 示例整目录挂载 ./nginx:/etc/nginx/conf.d:ro,目录挂载无此坑。
  2. Web 根交叉挂载(./mybb):mybb 读写(向导写 config.php、PHP 写 cache/uploads),web 只读(nginx 出静态文件)。同一宿主目录两个视角,即官方 README 的静态资源共享方案。
  3. 数据库数据目录(./data/db → /var/lib/mysql:rw):bind mount 便于直接 rsync 备份;若偏好命名卷,改 db-data:/var/lib/mysql 并在顶层声明 volumes: db-data:(等价 docker run 形态见第九章)。

九、等价 docker run

三服务编排对应的一次性语法实测(--rm 不产生常驻服务):

docker run --rm --network mybb_mybbnet -v $(pwd)/mybb:/var/www/html mybb/mybb:1.8.41 php -v | head -1
docker run --rm --network mybb_mybbnet mybb/mybb:1.8.41 php -r '$m=new mysqli("db","mybb","q1w2e3r4","mybb"); echo $m->query("SELECT VERSION()")->fetch_row()[0];'
docker run --rm nginx:1.27-alpine nginx -v 2>&1

实测回显(第三条含 entrypoint 初始化噪音,取尾部):

PHP 8.2.35 (cli) (built: Oct 21 2026 22:54:10) (NTS)
11.4.13-MariaDB-ubu2404
nginx version: nginx/1.27.5

第二条若不带 -v 挂载 Web 根,回显前还会多出 MyBB not found in /var/www/html - copying now... 两行——entrypoint 把源码播种进镜像自身目录(随 --rm 销毁),这反向印证了播种逻辑对挂载目录的依赖。

三个服务常驻运行的等价命令:

docker network create --subnet 10.89.68.0/24 --gateway 10.89.68.1 mybb_net

docker run -d --name mybb-db --network mybb_net --restart unless-stopped \
  -e MARIADB_ROOT_PASSWORD=q1w2e3r4 -e MARIADB_DATABASE=mybb \
  -e MARIADB_USER=mybb -e MARIADB_PASSWORD=q1w2e3r4 \
  -v $(pwd)/data/db:/var/lib/mysql mariadb:11.4

docker run -d --name mybb-app --network mybb_net --restart unless-stopped \
  -v $(pwd)/mybb:/var/www/html mybb/mybb:1.8.41

docker run -d --name mybb-web --network mybb_net --restart unless-stopped \
  -p 8144:80 \
  -v $(pwd)/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \
  -v $(pwd)/mybb:/var/www/html:ro nginx:1.27-alpine

docker run 形态丢失 depends_on 健康把关(需自行确认 db 就绪后再起后两个)与统一编排生命周期,生产建议保持 compose 编排。

十、常用运维命令速查

docker compose ps                          # 三服务状态(回显见 4.4)
docker compose logs -f mybb                # 应用/FPM 报错(error_log=stderr,见 7.2)
docker compose logs -f web                 # nginx 访问/错误日志
docker compose restart web                 # vhost 常规重载
docker compose down                        # 停栈删网络,bind mount 数据不动
docker compose down -v                     # 本栈无命名卷,-v 无额外作用
docker compose up -d --force-recreate web  # 单文件挂载 inode 更换后重建(见 11.2)
docker exec -it mybb-db mariadb -umybb -pq1w2e3r4 mybb   # 进数据库
docker exec mybb-app ls /var/www/html/uploads            # 查附件目录

docker compose restart web 实测回显:

 Container mybb-web Restarting 
 Container mybb-web Started 

定时任务:MyBB 无独立守护进程,任务体系 = Web 根 task.php 入口 + inc/tasks/ 下 14 个任务脚本(backupdb、dailycleanup、massmail、promotions、sendmailqueue、userpruning、versioncheck 等),执行计划存 mybb_tasks 表。实测查询计划:

docker exec mybb-db mariadb -umybb -pq1w2e3r4 mybb -e "SELECT tid,title,minute FROM mybb_tasks LIMIT 6"

实测回显:

tid  title                     minute
1    Hourly Cleanup            0
2    Daily Cleanup             0
3    Half-hourly User Cleanup  30,59
4    Weekly Backup             0
5    Promotion System          5,25,45
6    Thread Views              10,25,40,55

两种触发方式均实测:Web 触发 curl http://127.0.0.1:8144/task.php → HTTP 200(宿主 crontab 推荐此法);CLI 触发 docker exec mybb-app php /var/www/html/task.php 退出码 0 但会打 functions_task.php 的 null-offset Warning(CLI 无 HTTP 上下文),推荐用 Web 触发。任务机制与 ACP 缓存重建细节见 《MyBB 1.8.41 常用运维命令与排障详解》。

版本升级:镜像代码内置在 /usr/src/mybb-mybb_<版本>,挂载目录已有 index.php 时 entrypoint 不会把新版本源码同步进来。安全姿势:备份 inc/config.php 与 uploads/ → 清空(或改名保留)./mybb → 改 compose 镜像 tag → up -d 触发新版播种 → 回填 config.php 与 uploads;或给 mybb 服务加 command: --skip-old-files php-fpm 让播种保留已有文件。数据库 schema 的升级差异走 MyBB 官方 changed_files 升级包流程(见 《MyBB 1.8.41 常用运维命令与排障详解》)。

十一、常见问题(排障实录)

11.1 上传附件/插件报 413 Request Entity Too Large

现象:上传超过 1MB 的文件(附件、插件安装包)被拒;而 PHP 侧 upload_max_filesize 明明是 10M。

定位:复现(2MB 表单提交到 ACP 登录端点):

dd if=/dev/zero of=bigpost.bin bs=1M count=2
curl -s -o /dev/null -w 'POST 2MB -> HTTP %{http_code}\n' -F "file=@bigpost.bin" http://127.0.0.1:8144/admin/index.php

实测回显:

POST 2MB -> HTTP 413

nginx 错误日志直接给出原因:

2026/11/02 07:56:57 [error] 21#21: *1 client intended to send too large body: 2097367 bytes, client: 10.89.68.1, server: , request: "POST /admin/index.php HTTP/1.1", host: "127.0.0.1:8144"

根因:官方 gist vhost 未设 client_max_body_size,nginx 默认 1MB 在请求进入 PHP 前就拦截(client: 10.89.68.1 即网关,对应宿主 8144 入口)。

修复:server 块加 client_max_body_size 10m;(对齐镜像 PHP 上限),重载:

docker exec mybb-web nginx -s reload

复测实测回显:

POST 2MB -> HTTP 200

11.2 改了 vhost 文件但容器里不生效(单文件 bind mount 的 inode 坑)

现象:宿主注释掉 default.conf 里的 client_max_body_size,nginx -s reload 成功,但 413 行为毫无变化;进容器 grep,看到的还是旧内容。

定位:宿主与容器同路径文件内容对照:

grep -n client_max nginx/default.conf
docker exec mybb-web grep -n client_max /etc/nginx/conf.d/default.conf

实测回显(本实录复现时:宿主已注释,容器仍为生效行):

8:    #client_max_body_size 10m;
8:    client_max_body_size 10m;

根因:单文件 bind mount 绑定的是inode 而非路径。sed -i、vim(默认备份写新文件再改名)等工具替换了文件 inode,容器仍打开旧 inode;原地截断写入(如 echo >>、部分编辑器)则无此问题。

修复:重建服务重新建立挂载:

docker compose up -d --force-recreate web

实测回显:

 Container mybb-web Starting 
 Container mybb-web Started 

重建后容器即见新内容(本实测借此完成 11.1 的 413 复现)。预防:vhost 建议整目录挂载 ./nginx:/etc/nginx/conf.d:ro(官方 README 示例即如此),或改完配置统一 --force-recreate。

11.3 ACP 404:后台不在 /inc/admin/ 下

现象:访问 /inc/admin/index.php 返回 nginx 的 404 页面(不是 MyBB 报错页)。

定位:两层原因叠加——① MyBB 的 ACP 实际在 Web 根 admin/ 目录(路径由 inc/config.php 的 $config['admin_dir'] 控制,默认 admin),inc/ 下只有类库,不存在 admin/;② vhost 的 location ~ inc/ { internal; } 本就禁止一切 inc/ 路径的 HTTP 访问(拦截是正确行为,inc/config.php 含数据库口令,实测 GET /inc/config.php -> HTTP 404)。

修复:走正确入口:

curl -s -o /dev/null -w 'GET /admin/ -> HTTP %{http_code}\n' http://127.0.0.1:8144/admin/

实测回显:

GET /admin/ -> HTTP 200

登录页标题 MyBB Control Panel - Login,字段 username / password / pin / do=login(PIN 即 4.5 设置的 1234)。生产建议把 admin_dir 改成生僻值并同步 vhost 规则。

11.4 端口槽位被占:8143/8147 绑不上

现象:按规划用 8143 发布 web,ss -tlnp 显示已被宿主 IDE 进程占用(回显见 3.2)。

修复:改用同段空闲 8144。注意即使占用进程只绑了 127.0.0.1,docker 发布 0.0.0.0:8143 仍会端口冲突,不能侥幸。

11.5 国外源直连超时:Docker Hub / raw.githubusercontent

现象:curl "https://hub.docker.com/v2/repositories/search?query=mybb" 超时(exit 28);raw.githubusercontent.com 直连拉 README 超时。

修复:镜像拉取走 daemon registry-mirrors(本宿主配置 docker.m.daocloud.io、docker.1ms.run、hub.rat.dev 三加速源,拉取全部成功);仓库文件走代理 192.168.1.72:7897,或改走 GitHub API(api.github.com 本实测直连可通,contents 接口返回 base64 内容)。

十二、参考链接

MyBB 1.8.41 Docker Compose 部署指南 - Quzuo