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 全量实测。
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 二次 PIN1234) - 数据库账号:库/用户/口令
mybb/mybb/q1w2e3r4,root 口令q1w2e3r4;3306 不对外发布,仅内网访问 - 自定义网络:
mybb_mybbnet(子网10.89.68.0/24,网关10.89.68.1;静态 IP:db10.89.68.10、mybb10.89.68.11、web10.89.68.12) - 三服务常驻内存实测(安装完成并浏览若干页面后采样,
docker stats --no-stream):
| 服务 | 内存占用 | 说明 |
|---|---|---|
| mybb-db | 95MiB | MariaDB 11.4(75 张表) |
| mybb-app | 53.21MiB | PHP-FPM 8.2(MyBB 本体) |
| mybb-web | 13.34MiB | nginx 反代 + 静态文件 |
| 合计 | 约 161MiB | 1GB 内存宿主即可轻松运行 |
二、镜像选型说明
官方文档站 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.41 | MyBB 官方组织(基于 php:8.2-fpm-alpine) | 1.8.41 | 159MB | PHP-FPM 应用(MyBB 源码内置镜像) |
nginx:1.27-alpine | Docker Hub 官方 | 1.27.5 | 74.5MB | 反代 + 静态文件服务 |
mariadb:11.4 | MariaDB 官方 | 11.4.13 | 455MB | 数据库 |
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源码包 tagmybb_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/mybb | 186,664 | 官方组织,tag 随版本发布同步(1.8.41,2026-10-23) |
fbmac/mybb | 25,083 | 社区单体打包(Apache+MyBB 合一),多年未更新 |
mariomarin/mybb 等 | <2,000 | 个人打包(含 confd 模板),维护弱 |
💡 技术拓展:论坛类软件的容器交付形态主要有三类——
形态 代表 取舍 官方组织预构建镜像 + 版本 tag MyBB(mybb/mybb)、Grafana 拉取即用、升级改 tag;代码内置在镜像里,挂载目录承载可写数据 官方部署包本地构建 Misago(misago_docker) 应用与编排同仓库演进;首次构建耗时 无官方容器化、社区 compose 文件 phpBB 灵活但质量参差,供应链风险自担 MyBB 属第一类且官方路径清晰(组织镜像 + README 官方 compose 示例),本文即按官方路径部署。
⚠️ 网络说明:本实测环境直连
hub.docker.comAPI 超时(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 themybbandnginxcontainers"); - 静态 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_pdo PDO 封装 MySQL 需要统一 PDO 接口 pgsql / pgsql_pdo PostgreSQL PG 站点(官方 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/html | mybb(rw)+ web(ro) | 应用代码、inc/config.php、uploads/(附件/头像/签名)、cache/(数据缓存);ACP 首次数据库备份会再建 backupdb/ |
./data/db/ | /var/lib/mysql | db(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 解读)。
六、环境变量表
| 服务 | 变量 | 实测值 | 说明 |
|---|---|---|---|
| db | MARIADB_ROOT_PASSWORD | q1w2e3r4 | root 口令(演示) |
| db | MARIADB_DATABASE | mybb | 首启预建库,向导直接连用 |
| db | MARIADB_USER | mybb | 首启预建业务账号 |
| db | MARIADB_PASSWORD | q1w2e3r4 | 业务账号口令 |
| mybb | (无) | — | MyBB 不读 env 配置;配置在 inc/config.php(向导写)与 mybb_settings 表(ACP 管理) |
| web | (无) | — | vhost 走文件挂载,无 env 注入 |
⚠️ 注意:改
MARIADB_*环境变量不会改数据库口令——./data/db非空时 MariaDB 镜像跳过初始化(env 只在空目录首启生效)。改口令需 SQLALTER 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.ini | opcache.memory_consumption=128、max_accelerated_files=4000、revalidate_freq=2 | 字节码缓存 128MB;改代码最长 2 秒生效 |
error-logging.ini | display_errors=Off、log_errors=On、error_log=/dev/stderr | 报错进服务日志(docker compose logs mybb),不外泄到页面 |
mybb-recommended.ini | upload_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 配置参数详解》。
八、配置文件挂载
本栈三类挂载,各有注意事项:
- 单文件 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,目录挂载无此坑。 - Web 根交叉挂载(
./mybb):mybb 读写(向导写 config.php、PHP 写 cache/uploads),web 只读(nginx 出静态文件)。同一宿主目录两个视角,即官方 README 的静态资源共享方案。 - 数据库数据目录(
./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 源码仓库(版本实查):https://github.com/mybb/mybb (tag
mybb_1841,2026-09-16) - 官方 Dockerfile 仓库:https://github.com/mybb/docker
- 官方镜像页:https://hub.docker.com/r/mybb/mybb/tags (latest / 1.8 / 1.8.41,2026-10-23 更新)
- 官方安装文档(无 Docker 路径,本文向导步骤对照):https://docs.mybb.com/1.8/install/
- 官方 README 的 nginx vhost 示例:https://gist.github.com/kawaii/ed2fbbf11309b8f635a623fa87abce8d
- 站内相关:《MyBB 1.8.41 介绍与选型指南》、《Ubuntu 22.04 安装 MyBB 指南》、《MyBB 1.8.41 配置参数详解》、《MyBB 1.8.41 常用运维命令与排障详解》