标签: Docker

  • 运维复盘:WordPress 事故恢复与架构升级实战记录

    1. 事故背景
      现状:服务器上有运行中的 WordPress 和 MySQL 8.0 容器。

    问题:/root/wordpress-app/ 目录下的 docker-compose.yml 丢失,导致无法对现有容器进行升级、维护或修改。

    需求:

    100% 还原配置文件。

    解决站点健康中提示的“页面缓存”性能问题。

    提升安全性(更换默认/已知密码)。

    1. 阶段一:逆向工程——找回配置
      由于容器还在运行,我们通过 Docker 内部信息反推配置。

    找回密码:通过 docker inspect wordpress_app | grep WORDPRESS_DB_PASSWORD 获取了连接密码。

    定位数据卷:通过 docker inspect 确认了数据卷名为 wordpress-app_wp_data 和 wordpress-app_db_data。

    重构 YAML:

    关键点:在 volumes 部分必须标记 external: true。这告诉 Docker:“卷已经存在了,直接挂载就好,千万别给我创建新的空卷”,否则数据会丢失。

    1. 阶段二:性能飞跃——引入双层缓存
      为了解决 WordPress 提示的“页面缓存”告警,我们实施了架构升级。

    架构图示
    操作步骤
    修改配置:在 docker-compose.yml 中新增 redis 服务。

    配置注入:在 WordPress 环境变量中加入 WORDPRESS_CONFIG_EXTRA,自动将 Redis 链接信息写入 wp-config.php。

    应用变更:执行 docker compose up -d。此时 WordPress 容器被“Recreated”(重建),但由于数据卷是外部挂载的,文章和图片毫发无损。

    插件激活:

    WP Super Cache:实现页面级静态化(解决站点健康告警)。

    Redis Object Cache:实现数据库查询缓存(提升后台操作速度)。

    1. 阶段三:安全加固——修改数据库密码
      修改已运行中的 MySQL 密码不能只改配置文件,必须遵循“锁钥匙同步”原则。

    关键流程:
    手动换锁:进入容器内部修改 MySQL 用户表。

    Bash

    docker exec -it wordpress_db mysql -u root -p旧密码
    ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘新密码’;
    FLUSH PRIVILEGES;
    同步钥匙:将 docker-compose.yml 中的两处密码同步修改为新密码。

    重启生效:执行 docker compose up -d,让 WordPress 带着新钥匙重新连接数据库。

    1. 核心:最终版生产环境 docker-compose.yml
      YAML

    name: wordpress-app

    services:
    db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: always
    environment:
    MYSQL_DATABASE: wordpress
    MYSQL_ROOT_PASSWORD: “你的新密码”
    volumes:
    – wordpress-app_db_data:/var/lib/mysql

    redis:
    image: redis:6-alpine
    container_name: wordpress_redis
    restart: always

    wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    restart: always
    ports:
    – “8080:80”
    environment:
    WORDPRESS_DB_HOST: db
    WORDPRESS_DB_USER: root
    WORDPRESS_DB_PASSWORD: “你的新密码”
    WORDPRESS_CONFIG_EXTRA: |
    define( ‘WP_REDIS_HOST’, ‘redis’ );
    define( ‘WP_REDIS_PORT’, 6379 );
    volumes:
    – wordpress-app_wp_data:/var/www/html
    depends_on:
    – db
    – redis

    volumes:
    wordpress-app_wp_data:
    external: true
    wordpress-app_db_data:
    external: true

    1. 经验与教训 (Best Practices)
      配置文件是灵魂:一定要备份 docker-compose.yml 到云端或 Git。

    External 是护身符:只要使用了外部卷(External Volumes),容器随便怎么删,数据永远在宿主机磁盘上。

    缓存是刚需:对于 WordPress,WP Super Cache + Redis 是标配,能极大延长服务器寿命。

  • 使用Docker部署WordPress

    一、获取docker安装文档(基于Debian13)

    https://docs.docker.com/engine/install/debian

    二、创建目录(方便管理项目文件以及配置)

    mkdir -p /root/wordpress-app && cd /root/wordpress-app

    三、创建 docker-compose.yml

    使用 nano docker-compose.yml 命令创建文件,并将以下内容粘贴进去。这个配置包含了 WordPress 容器和 MySQL 8.0 数据库。

    services:db:image: mysql:8.0container_name: wordpress_dbrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: your_root_password  # 修改为你的数据库管理员密码MYSQL_DATABASE: wordpressMYSQL_USER: wordpress_userMYSQL_PASSWORD: wordpress_password       # 修改为你的数据库用户密码volumes:      - db_data:/var/lib/mysqlnetworks:      - wp_networkwordpress:image: wordpress:latestcontainer_name: wordpress_apprestart: alwaysports:      - "8080:80"  # 外部访问端口,如果你想用 80 端口,改为 "80:80"environment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpress_userWORDPRESS_DB_PASSWORD: wordpress_password # 必须与上面 db 处的密码一致WORDPRESS_DB_NAME: wordpressvolumes:      - wp_data:/var/www/htmldepends_on:      - dbnetworks:      - wp_networknetworks:wp_network:driver: bridgevolumes:db_data:wp_data:

    四、启动部署

    在当前目录下运行以下命令:(cd /root/wordpress-app)

    docker compose up -d

    -d 表示在后台运行

    五、验证运行状态

    检查容器是否正常启动:

    docker compose ps

    能看到 wordpress_app 和 wordpress_db 两个容器的状态都是 Up

    六、访问与配置

    1. 打开浏览器,输入服务器 IP 地址和端口:http://你的服务器IP:8080
    2. 你将看到 WordPress 的安装界面。
    3. 按照提示选择语言、设置网站标题、管理员账号和密码。

    七、部署Nginx

    想通过域名(如 blog.youer.com)访问,需要您安装最新版的Nginx,配置一个反向代理:

    先执行

    aptupdateaptinstall -y nginx

    创建反向代理配置文件

    Nginx 的配置建议每个站点一个文件。创建一个新文件(以你的域名命名,例如 blog.conf):

    nano /etc/nginx/sites-available/wordpress

    将以下内容粘贴进去(注意修改 server_name):

    server {listen80;server_name blog.youer.com; # 这里改成你解析好的域名# 限制上传文件大小(WordPress 上传插件或主题需要)client_max_body_size64M;location / {proxy_pass http://127.0.0.1:8080; # 对应 Docker 中的端口# 传递真实的客户端信息给后端proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 解决 WordPress 登录重定向循环的问题proxy_redirectoff;    }}

    启用配置并重启

    在 Debian/Ubuntu 系统中,你需要将文件从 sites-available 软链接到 sites-enabled

    # 1. 建立软链接启用配置ln-s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/# 2. 测试配置文件语法是否正确nginx-t# 3. 如果显示 syntax is ok,则重启 Nginxsystemctlrestart nginx

    开启 HTTPS (强烈建议)

    既然用了反代,用 Certbot 申请免费的 Let’s Encrypt 证书非常简单:

    # 安装 Certbotaptinstall -y python3-certbot-nginx# 运行申请脚本(按提示输入邮箱,选 A 和 Y)certbot--nginx -d blog.youer.com

    Certbot 会自动修改你的 Nginx 配置文件,把 80 端口强制跳转到 443

    八、常用维护命令

    查看日志(排查报错):docker compose logs -f

    停止并删除容器docker compose down

    重启服务docker compose restart

    备份数据

    • 数据库数据存在 db_data 卷中。
    • 网页文件存在 wp_data 卷中。
    • 物理路径通常在 /var/lib/docker/volumes/ 下。