使用 Docker Compose 部署和升级 WordPress 的最佳实践

本文将详细介绍如何使用 Docker Compose 部署 WordPress,并探讨在挂载宿主机目录持久化数据的情况下,如何安全地升级到高版本镜像,并提供一些高级优化建议和常见问题的解决方案。


一、核心结论

  1. 用户数据安全
    只要正确挂载了 wp-content 目录,主题、插件、上传文件等用户数据不会丢失
  2. WordPress 核心代码自动升级
    WordPress 容器启动时会检测代码版本与数据库版本,若不一致会自动触发数据库升级流程
  3. 潜在风险
    插件/主题兼容性、跨大版本升级时的数据库结构变化可能导致问题。

二、详细影响分析

1. 用户数据保留(正确挂载时)

  • 最佳实践:应仅挂载 wp-content 目录(存放用户数据),而非整个 WordPress 目录。
    yaml
    volumes:
      - ./wp-content:/var/www/html/wp-content  # ✅ 正确做法
      # - ./wordpress:/var/www/html            # ❌ 错误做法(可能导致核心文件冲突)
  • 后果:镜像升级后,新容器将使用新版 WordPress 核心代码,但用户数据通过卷保留。

2. 数据库自动升级

  • 流程:WordPress 容器启动时检测到代码版本 > 数据库版本,会自动执行 wp-admin/includes/upgrade.php 更新数据库结构。
  • 日志验证:通过 docker logs <container_id> 可看到类似输出:
    log
    WordPress database upgrade detected. Running upgrade...

3. 潜在风险场景

  • 插件/主题兼容性:新版 WordPress 可能导致旧插件/主题崩溃(建议提前测试)。
  • 跨大版本跳跃:例如从 4.x 直接升级到 6.x,可能需逐步升级(如 4.x → 5.x → 6.x)。
  • MySQL 版本变更:若同时升级 MySQL 镜像,需确认数据卷兼容性(可先备份)。

三、操作建议

1. 升级前必做步骤

  • 备份数据
    bash
    # 备份 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

yaml
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
完整的yaml文件:
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. 执行升级

bash
docker-compose down
docker-compose pull        # 拉取新镜像
docker-compose up -d

4. 监控升级结果

bash
# 查看 WordPress 日志
docker logs <wordpress_container_id> | grep "upgrade"

# 检查网站状态
curl -I http://localhost:8080

四、故障恢复

  • 回滚镜像版本
    修改 docker-compose.yml 回退镜像标签,重新部署即可还原。
  • 数据库恢复
    bash
    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. 安全增强

yaml
# 在 MySQL 服务中添加安全配置
mysql:
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password  # 使用 secrets
    MYSQL_INITDB_SKIP_TZINFO: 1  # 跳过时区表(已手动设置时区)

操作步骤

bash
# 创建 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. 性能调优

yaml
# 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. 日志管理

yaml
# 所有服务添加日志限制
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)

八、版本升级检查清单

  1. 阅读 WordPress 版本说明
  2. 在 Staging 环境测试升级
  3. 禁用所有缓存插件
  4. 检查 PHP 版本兼容性(docker run --rm wordpress:X.Y.Z php -v
  5. 准备回滚脚本(git tag v1.0-backup && docker-compose -f docker-compose.prev.yml up -d

九、终极建议:基础设施即代码化

  1. 将 Compose 文件存入 Git 仓库
  2. 使用 env_file 管理环境变量
  3. 结合 CI/CD 实现:
    yaml
    # .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"

 

作者: cavalier

能源行业从业者,业余爱好象棋、C++还有二胡、乒乓也很喜欢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注