前言

传统部署 WordPress 需要手动安装 Nginx/Apache、PHP、MySQL,配置各种参数,踩坑不断。而 Docker Compose 只需要一个配置文件,一条命令就能完成部署,环境隔离、数据持久化、一键启停,体验完全不同。

本文记录使用 Docker Compose 部署 WordPress + MySQL 的完整过程,包含踩坑点和运维技巧。

为什么用 Docker Compose 部署 WordPress

对比项传统方式Docker Compose
环境搭建手动装 Nginx + PHP + MySQL,配置复杂一个 yml 文件搞定
环境隔离容易污染系统环境容器隔离,互不影响
迁移部署需要重新搭建复制文件,一条命令启动
版本管理手动升级,可能出兼容问题改镜像版本号即可
数据备份需要分别备份 MySQL 和文件Docker 卷统一管理

环境准备

操作系统:Linux(本文使用 openEuler/CentOS 均可)

需要安装:

  • Docker
  • Docker Compose
# 安装 Docker
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

# 验证
docker --version
docker-compose --version

项目结构

docker-wordpress/
├── docker-compose.yml    # 核心部署配置
├── .env.example          # 环境变量模板
└── .gitignore            # Git 忽略规则

核心配置详解

完整 docker-compose.yml

services:
  db:
    image: mysql:8.0
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
        - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-somewordpress}
      - MYSQL_DATABASE=${MYSQL_DATABASE:-wordpress}
      - MYSQL_USER=${MYSQL_USER:-wordpress}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD:-wordpress}
    healthcheck:
      test: ["CMD","mysqladmin","ping","-h","localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    expose:
        - 3306
        - 33060

  wordpress:
    image: wordpress:latest
    volumes:
        - wp_data:/var/www/html
    ports:
        - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-db}
      - WORDPRESS_DB_USER=${WORDPRESS_DB_USER:-wordpress}
      - WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-wordpress}
      - WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME:-wordpress}
    depends_on:
      db:
        condition: service_healthy

volumes:
  db_data:
  wp_data:

关键配置解释

1. MySQL 认证方式

command: '--default-authentication-plugin=mysql_native_password'

MySQL 8.0 默认使用 caching_sha2_password 认证,WordPress 的 PHP 驱动不支持,必须改为 mysql_native_password,否则连接会报错。

2. 数据持久化

volumes:
  - db_data:/var/lib/mysql
  - wp_data:/var/www/html

把 MySQL 数据和 WordPress 文件挂载到 Docker 卷,容器删除后数据不丢失。

3. 环境变量 + 默认值

MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-somewordpress}

${变量名:-默认值} 语法:优先读 .env 文件中的值,没有就用默认值。这样密码不硬编码在 yml 里,安全性更好。

4. 健康检查(重点!)

healthcheck:
  test: ["CMD","mysqladmin","ping","-h","localhost"]
  interval: 10s
  timeout: 5s
  retries: 5

depends_on:
  db:
    condition: service_healthy

这是踩坑点!没有健康检查时,WordPress 启动时 MySQL 可能还没初始化完成,导致连接失败。加上 healthcheck + condition: service_healthy,WordPress 会等 MySQL 真正可用了才启动。

5. 端口说明

expose:
  - 3306      # 容器内部端口,不暴露到宿主机
ports:
  - 80:80     # 宿主机 80 端口映射到容器 80 端口

MySQL 只需要容器间访问,用 expose;WordPress 需要外部访问,用 ports

部署步骤

第一步:创建配置文件

# 创建项目目录
mkdir docker-wordpress && cd docker-wordpress

# 创建 .env 文件(从模板复制)
cp .env.example .env

# 按需修改密码
vim .env

.env.example 内容:

# MySQL 配置
MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress

# WordPress 配置
WORDPRESS_DB_HOST=db
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
WORDPRESS_DB_NAME=wordpress

第二步:启动

docker-compose up -d

首次启动会拉取镜像,需要等待。

第三步:查看状态

docker-compose ps

正常输出:

NAME                    STATUS              PORTS
docker-wordpress-db-1      Up (healthy)     3306/tcp, 33060/tcp
docker-wordpress-wordpress-1  Up             0.0.0.0:80->80/tcp

注意 db 容器显示 (healthy) 表示健康检查通过。

第四步:浏览器访问

打开浏览器访问 http://你的服务器IP,进入 WordPress 安装界面:

  • 选择语言
  • 设置站点标题、管理员账号密码
  • 安装完成

踩坑记录

坑1:MySQL 认证方式报错

现象:WordPress 连接数据库时报错 The server requested authentication method unknown to the client

原因:MySQL 8.0 默认使用 caching_sha2_password,WordPress 的 PHP mysql 驱动不支持

解决:在 MySQL 启动命令加 --default-authentication-plugin=mysql_native_password

坑2:WordPress 启动时数据库还没准备好

现象:容器启动后 WordPress 报数据库连接错误

原因:MySQL 容器启动了,但数据库初始化还没完成,WordPress 就开始连接了

解决:使用 healthcheck + depends_on: condition: service_healthy

坑3:数据丢失

现象docker-compose down 后数据没了

原因:没有配置 volumes 持久化

解决:给 MySQL 和 WordPress 都配置 volumes

常用运维命令

# 查看容器状态
docker-compose ps

# 查看日志(实时跟踪)
docker-compose logs -f

# 查看某个服务的日志
docker-compose logs -f db
docker-compose logs -f wordpress

# 停止服务
docker-compose stop

# 停止并删除容器(数据保留在卷中)
docker-compose down

# 停止并删除容器 + 数据(慎用!)
docker-compose down -v

# 重启
docker-compose restart

# 进入容器
docker exec -it docker-wordpress-db-1 bash
docker exec -it docker-wordpress-wordpress-1 bash

备份与恢复

备份

# 备份 MySQL 数据
docker exec docker-wordpress-db-1 mysqldump -u wordpress -p wordpress > backup.sql

# 备份 WordPress 文件
docker cp docker-wordpress-wordpress-1:/var/www/html ./wp-backup

恢复

# 恢复 MySQL
docker exec -i docker-wordpress-db-1 mysql -u wordpress -p wordpress < backup.sql

# 恢复文件
docker cp ./wp-backup docker-wordpress-wordpress-1:/var/www/html

扩展方向

  • 加 Nginx 反向代理:配置域名、HTTPS
  • 加 Redis 缓存:提升 WordPress 性能
  • 加 phpMyAdmin:Web 管理数据库
  • 多站点部署:一个 MySQL 实例跑多个 WordPress

总结

Docker Compose 部署 WordPress 的优势:

  • 配置即文档,一个 yml 文件描述整个架构
  • 一键启停,运维效率高
  • 环境隔离,不污染宿主机
  • 数据持久化,安全可靠

最关键的是健康检查配置,解决了 MySQL 初始化时序问题,避免了最常见的踩坑。


项目地址:https://gitee.com/pengjia12345/docker-wordpress

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐