11_compose/11.8_wordpress.md
版本说明:本示例使用以下镜像版本:
- MySQL:8.0(可替换为其他 8.x 版本,或使用 MariaDB 替代)
- WordPress:latest(建议在生产环境指定具体版本,如 6.x)
WordPress 是全球最流行的内容管理系统 (CMS)。使用 Docker Compose 可以在几分钟内搭建一个包含数据库、Web 服务和持久化存储的生产级 WordPress 环境。
wordpress/
├── compose.yaml
├── .env # 非敏感环境变量(如版本、端口)
├── secrets/ # 本地密钥文件,生产环境应由密钥管理系统提供
│ ├── db_root_password.txt
│ └── db_password.txt
└── nginx/ # 可选:反向代理配置
└── nginx.conf
compose.yaml这是一个可运行的单机最小配置,不是完整生产安全基线。正式部署前应固定镜像版本、放在反向代理/TLS 后面、限制公开端口、配置备份与监控,并按 WordPress 与插件生命周期做升级测试。
services:
# 数据库服务
db:
image: mysql:8.4
container_name: wordpress_db
restart: always
command:
# 启用原生密码认证(MySQL 8.4 默认禁用,旧版 WP 兼容性需要)
- --mysql-native-password=ON
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
volumes:
- db_data:/var/lib/mysql
networks:
- wp_net
# WordPress 服务
wordpress:
# 示例保留 latest 以便读者快速体验;生产环境请固定到经过测试的明确版本标签
image: wordpress:latest
container_name: wordpress_app
restart: always
ports:
# 本机调试入口;生产环境请通过反向代理发布 HTTPS
- "127.0.0.1:8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
WORDPRESS_DB_NAME: wordpress
secrets:
- db_password
volumes:
- wp_data:/var/www/html
# 增加上传文件大小限制
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
networks:
- wp_net
volumes:
db_data: # 数据库持久化
wp_data: # WordPress 文件(插件/主题/上传)持久化
networks:
wp_net:
secrets:
db_root_password:
file: ./secrets/db_root_password.txt
db_password:
file: ./secrets/db_password.txt
不要把数据库密码写入 compose.yaml、.env、命令行或 Git。Compose 官方建议敏感值使用 secrets;本地练习可用只读密钥文件模拟:
mkdir -p secrets
printf '%s\n' 'somestrongrootpassword' > secrets/db_root_password.txt
printf '%s\n' 'somestronguserpassword' > secrets/db_password.txt
chmod 600 secrets/*.txt
把 secrets/ 加入 .gitignore。生产环境应改用平台密钥管理能力,而不是把真实密码放在项目目录。
我们定义了两个命名卷:
db_data:确保 MySQL 容器重建后数据不丢失wp_data:保存 WordPress 的核心文件、插件、主题和上传的媒体文件默认的 WordPress 镜像上传文件限制较小 (通常 2MB)。创建 uploads.ini:
file_uploads = On
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
$ docker compose up -d
访问安装界面:
打开浏览器访问 http://localhost:8000
查看日志:
$ docker compose logs -f
不要只依赖 Volume。建议定期备份数据库:
## 导出 SQL
$ docker exec wordpress_db mysqldump -u wordpress -pwordpress wordpress > backup.sql
或者添加一个自动备份容器:
backup:
image: tiredofit/db-backup
volumes:
- ./backups:/backup
environment:
- DB_TYPE=mysql
- DB_HOST=db
- DB_NAME=wordpress
- DB_USER=wordpress
- DB_PASS=${DB_PASSWORD}
- DB_DUMP_FREQ=1440 # 每天备份一次
depends_on:
- db
networks:
- wp_net
在生产环境中,不要直接暴露 WordPress 端口,而是通过 Nginx 进行反向代理并配置 SSL。
WordPress 支持 Redis 缓存以提高性能。
redis:
image: redis:alpine
restart: always
networks:
- wp_net
在 WordPress 容器环境变量中添加:
WORDPRESS_REDIS_HOST: redis
并安装 Redis Object Cache 插件。
现象:访问页面显示 “Error establishing a database connection”。排查:
docker compose logs wordpress.env 中的密码与 YAML 文件引用一致WORDPRESS_DB_HOST 也是 db (服务名)解决:确保挂载了 uploads.ini 配置,并且重启了容器:
$ docker compose restart wordpress