本文将详细介绍如何使用 Docker Compose 部署 WordPress,并探讨在挂载宿主机目录持久化数据的情况下,如何安全地升级到高版本镜像,并提供一些高级优化建议和常见问题的解决方案。
一、核心结论
- 用户数据安全
只要正确挂载了wp-content
目录,主题、插件、上传文件等用户数据不会丢失。 - WordPress 核心代码自动升级
WordPress 容器启动时会检测代码版本与数据库版本,若不一致会自动触发数据库升级流程。 - 潜在风险
插件/主题兼容性、跨大版本升级时的数据库结构变化可能导致问题。
二、详细影响分析
1. 用户数据保留(正确挂载时)
- 最佳实践:应仅挂载
wp-content
目录(存放用户数据),而非整个 WordPress 目录。volumes: - ./wp-content:/var/www/html/wp-content # ✅ 正确做法 # - ./wordpress:/var/www/html # ❌ 错误做法(可能导致核心文件冲突)
- 后果:镜像升级后,新容器将使用新版 WordPress 核心代码,但用户数据通过卷保留。
2. 数据库自动升级
- 流程:WordPress 容器启动时检测到代码版本 > 数据库版本,会自动执行
wp-admin/includes/upgrade.php
更新数据库结构。 - 日志验证:通过
docker logs <container_id>
可看到类似输出:WordPress database upgrade detected. Running upgrade...
3. 潜在风险场景
- 插件/主题兼容性:新版 WordPress 可能导致旧插件/主题崩溃(建议提前测试)。
- 跨大版本跳跃:例如从 4.x 直接升级到 6.x,可能需逐步升级(如 4.x → 5.x → 6.x)。
- MySQL 版本变更:若同时升级 MySQL 镜像,需确认数据卷兼容性(可先备份)。
三、操作建议
1. 升级前必做步骤
- 备份数据:
# 备份 WordPress 文件 tar -czvf wp-content-backup.tar.gz ./wp-content # 备份 MySQL 数据库 docker exec <mysql_container> mysqldump -u root -p<password> wordpress > wordpress.sql
- 检查兼容性:
查看 WordPress 版本更新日志,确认是否破坏性变更。
2. 修改 docker-compose.yml
version: '3' services: wordpress: image: wordpress:6.5.2 # 修改为高版本 volumes: - ./wp-content:/var/www/html/wp-content depends_on: - mysql mysql: image: mysql:8.0 volumes: - ./mysql-data:/var/lib/mysql
version: '3.8' services: wordpress: image: wordpress:6.5.2 # 明确指定版本(推荐固定版本而非latest) container_name: wp-app restart: unless-stopped # 自动重启策略 networks: - wp-network depends_on: mysql: condition: service_healthy # 等待数据库就绪 environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wpuser WORDPRESS_DB_PASSWORD: wppassword WORDPRESS_DB_NAME: wordpress WORDPRESS_CONFIG_EXTRA: | define('WP_AUTO_UPDATE_CORE', false); # 禁用自动更新(由容器控制) volumes: - ./wp-content:/var/www/html/wp-content # ✅ 仅挂载用户数据目录 - ./php-conf/upload.ini:/usr/local/etc/php/conf.d/uploads.ini # 自定义PHP配置 ports: - "8080:80" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80"] interval: 30s timeout: 10s retries: 3 mysql: image: mysql:8.0 container_name: wp-db restart: unless-stopped networks: - wp-network environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: wordpress MYSQL_USER: wpuser MYSQL_PASSWORD: wppassword TZ: Asia/Shanghai # 设置时区 volumes: - ./mysql-data:/var/lib/mysql # 数据库持久化 - ./mysql-conf:/etc/mysql/conf.d # 自定义MySQL配置 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] interval: 20s timeout: 10s retries: 5 networks: wp-network: # 创建专用网络 driver: bridge ipam: config: - subnet: 172.20.0.0/24 # 可选资源限制(根据硬件调整) # deploy: # resources: # limits: # cpus: '1.0' # memory: 512M
3. 执行升级
docker-compose down docker-compose pull # 拉取新镜像 docker-compose up -d
4. 监控升级结果
# 查看 WordPress 日志 docker logs <wordpress_container_id> | grep "upgrade" # 检查网站状态 curl -I http://localhost:8080
四、故障恢复
- 回滚镜像版本:
修改docker-compose.yml
回退镜像标签,重新部署即可还原。 - 数据库恢复:
docker exec -i <mysql_container> mysql -u root -p<password> wordpress < wordpress.sql
五、进阶建议
- 使用健康检查:在 Compose 文件中添加健康检查确保服务可用。
- 版本渐进升级:跨多个主版本时,逐步升级(如 5.9 → 6.0 → 6.5)。
- CI/CD 测试:在 Staging 环境测试升级流程后再上生产环境。
通过以上步骤,您可以安全地将 WordPress 容器升级到高版本,同时确保数据持久化和服务稳定性。
六、高级优化补充方案
1. 安全增强
# 在 MySQL 服务中添加安全配置 mysql: environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password # 使用 secrets MYSQL_INITDB_SKIP_TZINFO: 1 # 跳过时区表(已手动设置时区)
操作步骤:
# 创建 secrets 文件(权限设为 400) echo "your_secure_root_password" > db_root_password chmod 400 db_root_password # 在 Compose 文件中添加 secrets 配置 services: mysql: secrets: - db_root_password secrets: db_root_password: file: ./db_root_password
2. 性能调优
# WordPress 添加 OPcache 配置 volumes: - ./php-conf/opcache.ini:/usr/local/etc/php/conf.d/opcache.ini # MySQL 配置优化 # 在 mysql-conf/ 目录下创建 my.cnf: [mysqld] innodb_buffer_pool_size = 1G max_connections = 200 query_cache_type = 1
3. 日志管理
# 所有服务添加日志限制 logging: driver: "json-file" options: max-size: "10m" max-file: "3"
七、常见问题快速诊断表
症状 | 检查命令 | 修复方案 |
---|---|---|
数据库连接失败 | docker exec wp-db mysqladmin ping |
检查 MySQL 容器日志和网络配置 |
502 Bad Gateway | docker logs wp-app | grep PHP |
调整 PHP-FPM 进程数或内存限制 |
上传文件大小限制 | docker exec wp-app php -i | grep max_file |
修改 upload.ini 并重启容器 |
主题/插件安装失败 | docker exec wp-app ls -l /var/www/html/wp-content |
检查目录权限 (chown -R www-data:www-data wp-content ) |
八、版本升级检查清单
- 阅读 WordPress 版本说明
- 在 Staging 环境测试升级
- 禁用所有缓存插件
- 检查 PHP 版本兼容性(
docker run --rm wordpress:X.Y.Z php -v
) - 准备回滚脚本(
git tag v1.0-backup && docker-compose -f docker-compose.prev.yml up -d
)
九、终极建议:基础设施即代码化
- 将 Compose 文件存入 Git 仓库
- 使用
env_file
管理环境变量 - 结合 CI/CD 实现:
# .gitlab-ci.yml 示例 deploy_prod: only: - tags script: - docker-compose -f docker-compose.prod.yml pull - docker-compose -f docker-compose.prod.yml up -d - curl -X POST "https://api.status.io/1.0/component/update" -d "status=operational"