用docker一键部署wordpress多站点,需在单站架构上启用网络模式,通过wordpress_config_extra注入multisite等定义,挂载完整wp-content以支持sites/目录隔离,并配nginx反向代理与https确保子站路由、cookie及静态资源正常。

用 Docker 一键部署 WordPress 多站点(Multisite)系统,核心在于:在标准单站架构基础上,启用 WordPress 的网络模式(Network Mode),并通过容器配置确保共享数据库、统一域名策略和可挂载的 wp-content 结构。它不是简单复制多个 WordPress 容器,而是让一个 WordPress 实例支持多个子域名或子目录站点,所有站点共用同一套核心文件和数据库表(带前缀区分)。
准备支持多站点的 WordPress 镜像与配置
官方 wordpress:latest 或 wordpress:php8.2-apache 镜像默认不开启多站点,需通过环境变量或挂载自定义配置触发:
- 使用
WORDPRESS_CONFIG_EXTRA注入关键定义,例如:define('WP_ALLOW_MULTISITE', true);define('MULTISITE', true);define('SUBDOMAIN_INSTALL', false); // 设为 true 则用子域名,false 用子目录define('DOMAIN_CURRENT_SITE', 'blog.example.com');define('PATH_CURRENT_SITE', '/'); - 确保挂载的
./wp-content目录可写,因为多站点会自动在wp-content/sites/下为每个新站点创建独立上传目录 - 避免使用
wordpress:cli等精简镜像,它们缺少 Apache 和 .htaccess 支持,而多站点依赖重写规则
docker-compose.yml 关键调整(子目录模式示例)
相比单站,需明确三点:数据库兼容性、URL 路由逻辑、静态资源路径隔离:
- MySQL 版本建议 5.7 或 8.0,无需额外配置;但必须启用
innodb_file_per_table=ON(默认已开),便于后期按站点导出数据 - WordPress 服务中添加
extra_hosts或确保宿主机 /etc/hosts 可解析主域名(如开发时加127.0.0.1 blog.example.com) - 暴露端口保持为
"8080:80",但后续需通过反向代理(如 Nginx)将blog.example.com和blog.example.com/site2统一转发到该容器 - 完整片段示例(子目录模式):
services:
db:
image: mysql:8.0
volumes:
- ./mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: my_root_pass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
wordpress:
image: wordpress:php8.2-apache
restart: unless-stopped
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_CONFIG_EXTRA: |
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'localhost:8080');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
volumes:
- ./wp-content:/var/www/html/wp-content
- ./custom-htaccess:/var/www/html/.htaccess:ro
depends_on:
- db
初始化与网络配置要点
首次访问 http://localhost:8080 后,WordPress 会提示启用网络 —— 这一步不能跳过,必须在后台「工具 → 网络设置」中提交表单,系统才会生成必要的 .htaccess 规则和数据库表(如 wp_blogs, wp_site):
- 若用子域名模式(
SUBDOMAIN_INSTALL=true),需确保 DNS 或本地 hosts 支持泛解析,例如:127.0.0.1 site1.blog.example.com127.0.0.1 site2.blog.example.com - 生成的
.htaccess必须挂载进容器且可读;Apache 需启用mod_rewrite(官方镜像已默认开启) - 所有站点的媒体文件实际存于
wp-content/uploads/(主站)或wp-content/sites/N/files/(子站),因此./wp-content挂载必须完整,不可只挂themes或plugins
生产环境必须补充的环节
多站点对反向代理和 HTTPS 更敏感,跳过这步会导致登录重定向失败、静态资源 404 或 Cookie 冲突:
- 加一层 Nginx 反向代理,将
blog.example.com和其子路径/子域名全部转给后端wordpress容器 - 在 Nginx 配置中显式传递 Host 头:
proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; - WordPress 中设置:
define('COOKIE_DOMAIN', ''); // 留空,避免跨站 Cookie 冲突define('ADMIN_COOKIE_PATH', '/');define('COOKIEPATH', '/'); - HTTPS 必须全站启用,否则子站点后台可能因混合内容被浏览器拦截;Let’s Encrypt + certbot 可自动签发通配符证书(如
*.blog.example.com)











