折腾过个人博客的站长都懂那种痛:兴致勃勃买了台云服务器,结果光是配 LNMP 环境就耗掉一整个周末。PHP 版本对不上、MySQL 扩展缺失、Nginx 重写规则写错一个字母,网站直接 502。更别提后面想迁移或者换服务器时,那一堆散落在系统各处的配置文件让人头皮发麻。
这两年笔者把所有站点都迁到了 Docker 环境,终于从环境泥潭里爬了出来。今天就把这套用 Docker Compose 快速一键部署 WordPress 与 MySQL 的实战流程拆开揉碎讲清楚,照着做,十分钟内你就能看到一个跑起来的全新站点。
为什么是 Docker Compose,而不是宝塔或手动编译?
💡 推荐阅读:别再手动 docker start 了:聊聊容器自启动那些坑与生产环境最优解
先说清楚这件事的逻辑。宝塔面板确实方便,但它本质上是在你的宿主机上直接装软件,时间久了系统里会残留各种依赖和配置,换服务器时几乎没法完整复刻。手动编译就更不用说了,纯属给自己找罪受。
Docker Compose 的思路完全不同。它把 WordPress 和 MySQL 各自装进独立容器,用一份 docker-compose.yml 文件描述它们之间的关系。这份文件就是你的“环境说明书”——换任何一台装了 Docker 的服务器,把文件拷过去执行一条命令,环境原样重现。
几个实打实的好处:
- 隔离干净:PHP 版本、MySQL 版本全部锁在容器里,不污染宿主机系统。
- 迁移无痛:整个站点就是一份配置文件加两个数据目录,打包带走即可。
- 版本可控:想换 PHP 8.2 还是 MySQL 8.0,改一行配置的事。
- 资源占用低:相比面板那一整套后台,容器方案更轻量。
动手前的环境准备
💡 延伸阅读:Nginx 防盗链配了还是被刷爆?聊聊我怎么堵住高频 IP 和恶意爬虫的
在开始敲命令之前,先把地基打好。这里有几件事必须提前确认。
1. 一台靠谱的云服务器
Docker 对配置要求不高,但 WordPress 跑起来还是需要点资源的。笔者建议至少 2 核 2G 内存起步,如果打算装几个插件或者有图片站需求,直接上 2 核 4G 更稳妥。国内的话选阿里云、腾讯云的活动机型就够用;面向海外用户的话,搬瓦工或者 Vultr 的入门款性价比不错。买服务器时记得选 Ubuntu 22.04 或 Debian 12 这类主流系统,别选那些冷门发行版,后面装 Docker 容易出幺蛾子。
2. 一个正经域名
别用 IP 直接访问,搜索引擎不友好,而且后面配 HTTPS 也麻烦。域名建议在 Namesilo 或者阿里云万网注册,.com 或 .net 优先。买完先把 A 记录解析到服务器 IP,这一步不做好,后面 SSL 证书申请会卡住。
3. 安装 Docker 与 Docker Compose
SSH 连上服务器,执行下面这串命令。这是 Docker 官方推荐的安装方式,比系统自带的版本新,坑也少。
# 更新系统包索引
sudo apt update && sudo apt upgrade -y
# 安装必要的依赖工具
sudo apt install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine 和 Compose 插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 验证安装是否成功
docker --version
docker compose version
看到版本号输出就说明装好了。顺手把当前用户加入 docker 组,省得以后每条命令都加 sudo:
sudo usermod -aG docker $USER
# 执行完记得退出 SSH 重新登录一次,权限才生效
核心实战:编写 docker-compose.yml
💡 深度技术指南:Linux 磁盘 100% 别急着删库!老站长手把手教你揪出“空间刺客”并优雅善后
这是整篇文章最关键的部分。先建一个项目目录,所有文件都放这里,方便管理。
mkdir -p ~/wordpress-docker && cd ~/wordpress-docker
然后用 nano 或 vim 创建 docker-compose.yml 文件,把下面的内容完整贴进去。每一行我都加了注释,照着改就行。
version: '3.8'
services:
# ---------- 数据库服务 ----------
db:
image: mysql:8.0
container_name: wp-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 换成你自己的强密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: 换成你自己的数据库密码
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- wp-network
# ---------- WordPress 服务 ----------
wordpress:
image: wordpress:latest
container_name: wp-app
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: 换成你自己的数据库密码
volumes:
- ./wp-data:/var/www/html
networks:
- wp-network
networks:
wp-network:
driver: bridge
几个细节必须强调一下:
- 密码别偷懒:
MYSQL_ROOT_PASSWORD和MYSQL_PASSWORD一定要换成复杂密码,别用 123456 这种。数据库端口没有映射到宿主机,所以外部访问不到,但密码该强还是得强。 - 端口映射:
8080:80表示把容器的 80 端口映射到宿主机的 8080。等后面配好 Nginx 反代和域名后,可以改成127.0.0.1:8080:80,只允许本机访问,更安全。 - 数据卷:
./mysql-data和./wp-data是数据持久化的关键。容器删了数据还在,千万别手贱删这两个目录。
一键启动与初始化
配置文件写好后,在项目目录下执行一条命令,剩下的事交给 Docker。
# 后台启动所有服务
docker compose up -d
# 查看容器运行状态
docker compose ps
看到两个容器的状态都是 Up 就说明跑起来了。第一次启动 MySQL 初始化需要十几秒,稍微等一下再访问。
浏览器打开 http://你的服务器IP:8080,应该能看到 WordPress 的安装界面。选择语言、填写站点标题、管理员账号密码,一路下一步。数据库信息已经在环境变量里配好了,不需要手动填。
安装完成后,后台地址是 http://你的服务器IP:8080/wp-admin,用刚才设置的账号登录即可。
避坑清单:这些坑笔者都替你踩过了
上面流程看着简单,但实际操作中总会遇到几个卡点。下面这些是高频问题,提前知道能省不少时间。
| 问题现象 | 原因 | 解决办法 |
|---|---|---|
| 访问 8080 端口无响应 | 云服务器安全组没放行端口 | 去云控制台安全组规则里放行 8080(或后续的 80/443) |
| WordPress 提示“建立数据库连接时出错” | MySQL 还没初始化完,或密码不一致 | 等 30 秒重试;检查 compose 文件里两处密码是否一致 |
| 上传主题或插件提示权限不足 | 容器内文件属主与宿主机不匹配 | 执行 sudo chown -R www-data:www-data ./wp-data |
| 重启服务器后站点打不开 | 容器没有设置自动重启 | 确认 compose 文件里有 restart: unless-stopped |
| 想换域名但后台地址改不了 | 数据库里写死了旧地址 | 用 WP-CLI 或直接改数据库 wp_options 表里的 siteurl 和 home |
另外提醒一句:生产环境千万别直接把 8080 暴露在公网。正确姿势是在宿主机装个 Nginx 做反向代理,配上 SSL 证书,把 80 和 443 转发到 127.0.0.1:8080。这样既安全,又能让 WordPress 正确识别 HTTPS 协议。
日常维护的几条命令
部署只是开始,后面还得会管。这几个命令建议存到备忘录里:
# 查看实时日志(排查问题必备)
docker compose logs -f wordpress
# 停止服务(数据保留)
docker compose stop
# 停止并删除容器(数据卷不受影响)
docker compose down
# 更新镜像并重建容器
docker compose pull && docker compose up -d
# 备份数据(直接打包两个数据目录)
tar -czvf wp-backup-$(date +%F).tar.gz ./wp-data ./mysql-data
备份这件事值得单独说。很多人觉得容器化了就不用备份,这是大错特错。数据卷虽然持久,但误删、系统盘损坏这些事谁也说不准。笔者习惯每周执行一次上面的打包命令,把备份文件同步到对象存储或者另一台机器上,图个心安。
最后说几句
用 Docker Compose 部署 WordPress,本质上是用一份声明式配置文件替代了手工装环境的过程。前期花二十分钟理解这套逻辑,后面换服务器、升级版本、做迁移时,省下的时间是以小时计的。
这套方案笔者已经跑了两年多,中间换过三次服务器,每次都是把项目目录打包拷过去,docker compose up -d 一条命令搞定。比起当年在宝塔里点来点去、还担心配置对不上的日子,实在清爽太多。
如果你还在犹豫要不要入 Docker 的坑,笔者的建议是:找个周末,拿一台测试机照着上面走一遍。跑通之后你会发现,这可能是你运维生涯里回报率最高的一次学习投入。