WordPress Docker Compose 部署图文教程
0. 环境速览
以下信息来自服务器上正在运行的 WordPress 容器(docker inspect wordpress 实测)。本服务器 WordPress 当前由 docker run 手动启动,本教程给出标准化的 Docker Compose 方案(配置与现网一致,可直接落地)。
| 项目 | 实际值 | 说明 |
|---|---|---|
| 镜像 | wordpress:latest | 官方镜像(内置 Apache + PHP + WordPress) |
| 容器名 | wordpress | – |
| 端口映射 | 0.0.0.0:8080 → 容器 80 | 外部通过 http://IP:8080 访问 |
| 站点文件 | wordpress_data 卷 → /var/www/html | Docker named volume,含全部程序与上传文件 |
| 数据库连接 | mysql:3306 / wordpress / wordpress | 主机名 mysql,库/用户均为 wordpress |
| 网络 | 1panel-network(172.18.0.0/16) | 与 MySQL 同网络,走容器内网直连 |
| 重启策略 | unless-stopped | 开机自启 |
| 启动命令 | apache2-foreground | 官方镜像默认入口 |
1. 部署架构
服务器IP:8080 → WordPress 容器(Apache)→ 同网络直连 mysql:3306 → MySQL 容器。数据库不需要对公网暴露,仅容器内网即可。
2. 前置条件
- Docker 与 Docker Compose 已安装(Docker ≥ 20.10,Compose v2)。
- MySQL 8.0 已按《MySQL Docker Compose 部署图文教程》部署,且已创建 WordPress 库与用户(即 compose 中
MYSQL_DATABASE=wordpress、MYSQL_USER=wordpress)。 - 两个容器处于同一个 Docker 网络(本教程沿用
1panel-network),否则 WordPress 无法用mysql主机名连库。
docker exec -it mysql mysql -uroot -p 后运行 CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 与 CREATE USER 'wordpress'@'%' IDENTIFIED BY '你的密码'; GRANT ALL ON wordpress.* TO 'wordpress'@'%'; FLUSH PRIVILEGES;;按教程一部署则这些已自动完成。
3. 步骤一:编写 docker-compose.yml
创建项目目录与 compose 文件:
sudo mkdir -p /opt/docker/wordpress
sudo vi /opt/docker/wordpress/docker-compose.yml
粘贴以下内容(数据库密码替换为 MySQL 教程中设置的值):
services:
wordpress:
image: wordpress:latest # 官方镜像(Apache+PHP+WordPress)
container_name: wordpress
restart: unless-stopped
ports:
- "8080:80" # 外部 8080 → 容器 80(想用 80 直接访问则改 "80:80")
environment:
WORDPRESS_DB_HOST: mysql:3306 # 数据库主机:MySQL 容器名:端口(同网络)
WORDPRESS_DB_USER: wordpress # 数据库用户
WORDPRESS_DB_PASSWORD: 你的数据库密码 # 必改
WORDPRESS_DB_NAME: wordpress # 数据库名
WORDPRESS_TABLE_PREFIX: wp_ # 表前缀(默认 wp_)
WORDPRESS_CONFIG_EXTRA: |
define( 'WP_MEMORY_LIMIT', '256M' ); # 可选:提高 PHP 内存上限
define( 'FS_METHOD', 'direct' ); # 可选:允许后台直接安装主题/插件
TZ: Asia/Shanghai
volumes:
- wordpress_data:/var/www/html # 站点全部文件(含 wp-content 上传)
depends_on:
- mysql # 等待 MySQL 先启动
networks:
- 1panel-network
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 你的Root强密码 # 必改
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 你的数据库密码
TZ: Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
volumes:
- /opt/mysql/data:/var/lib/mysql
- /opt/mysql/conf:/etc/mysql/conf.d
networks:
- 1panel-network
volumes:
wordpress_data: # named volume,数据持久化
networks:
1panel-network:
external: true # 复用已存在的网络
mysql: 服务整段删除,只保留 wordpress: 服务,并确保它加入 MySQL 所在的同一网络;② 若想一套 compose 全部起,则保留两个服务(上面写法)。两种方式 WordPress 的 WORDPRESS_DB_HOST 都填 mysql:3306。4. 步骤二:启动服务
cd /opt/docker/wordpress
docker compose up -d # 后台启动(首次会拉取 wordpress 镜像)
docker compose ps # 状态应为 Up
docker logs -f wordpress # 看到 "AH00094: Command line: 'apache2-foreground'" 即就绪
wordpress 由 docker run 启动),需先停止并移除旧容器再启动 compose:docker stop wordpress && docker rm wordpress。旧容器的数据卷 wordpress_data 会被新容器自动复用,站点数据不丢失(操作前建议先备份卷)。5. 步骤三:浏览器完成 WordPress 安装向导
浏览器访问(首次安装时)http://(服务器IP):8080 或你的域名,进入安装界面:
| 安装步骤 | 填写内容 |
|---|---|
| ① 选择语言 | 简体中文 → 继续 |
| ② 数据库连接 | 数据库名 wordpress · 用户名 wordpress · 密码(你设置的)· 数据库主机 mysql:3306 · 表前缀 wp_ |
| ③ 站点信息 | 站点标题、管理员用户名/密码/邮箱、不要勾选「搜索引擎不索引本站」 |
| ④ 完成 | 点击「安装 WordPress」→ 自动跳转 /wp-login.php 登录后台 |
mysql:3306(容器服务名),不要填 127.0.0.1 或服务器公网 IP——那会绕到宿主机 3306 端口,可能因防火墙或认证方式导致 “Error establishing a database connection”。6. 步骤四:验证与后台使用
# 验证站点文件与权限
docker exec wordpress ls /var/www/html # 应看到 wp-admin、wp-content、wp-config.php 等
# 验证数据库连接(容器内 PHP 连接测试)
docker exec wordpress php -r '$c=@new mysqli("mysql","wordpress","你的数据库密码","wordpress"); echo $c->connect_error ? "FAIL: ".$c->connect_error : "DB OK";'
# 进入后台
# 浏览器打开 http://IP:8080/wp-admin → 安装时设置的管理员账号登录
登录后台后即可:安装主题/插件(外观、插件)、发布文章、配置固定链接、接入 CDN 与 HTTPS 等。主题与插件会写入 /var/www/html/wp-content,位于 wordpress_data 卷内,容器重建不丢失。
7. 步骤五:日常运维与升级
# 查看日志 / 重启
docker compose logs -f wordpress
docker compose restart wordpress
# 升级 WordPress 镜像(先备份!)
docker compose pull wordpress
docker compose up -d wordpress
# 备份站点文件(wordpress_data 卷)
docker run --rm -v wordpress_data:/data -v /opt/docker/backup:/backup alpine tar czf /backup/wp-$(date +%F).tar.gz -C /data .
# 数据库备份(对应 MySQL 教程)
docker exec mysql mysqldump -uroot -p你的Root密码 wordpress --single-transaction > /opt/docker/backup/wp-db-$(date +%F).sql
docker compose up -d --force-recreate 重建容器,或回滚镜像标签。8. 常见问题 FAQ
Q1:安装时报 “Error establishing a database connection”
按顺序排查:① WORDPRESS_DB_HOST 必须是 mysql:3306;② WordPress 与 MySQL 是否在同一 Docker 网络(docker network inspect 1panel-network 看两个容器是否都在);③ 用户名/密码/库名是否与 MySQL 实际一致;④ MySQL 是否正常 docker compose ps。
Q2:8080 端口被占用 / 想直接用 80 端口
改 compose 端口映射 "80:80"(需先停掉占用 80 的进程,如 nginx),或换 "8081:80";改后 docker compose up -d 重建。若配了域名和 HTTPS,建议在 80/443 前挂 Nginx 反向代理。
Q3:后台提示 “要执行请求的操作,WordPress 需要访问您网页服务器的权限”(无法直接装主题/插件)
compose 已通过 WORDPRESS_CONFIG_EXTRA 写入 FS_METHOD=direct;若仍失败,检查 docker exec wordpress chown -R www-data:www-data /var/www/html 修正文件属主。
Q4:启用 HTTPS / 绑定域名
站点地址在「设置 → 常规」中改为 https://你的域名;推荐在容器外部署 Nginx + Let’s Encrypt 反代到 127.0.0.1:8080,并给 wp-config.php 增加 $_SERVER['HTTPS']='on';(或通过 WORDPRESS_CONFIG_EXTRA 注入反向代理处理代码)。
Q5:升级后页面样式/插件异常
多为缓存问题:后台「设置 → 固定链接」点一次「保存更改」刷新重写规则;同时清理浏览器缓存与 CDN 缓存。仍异常则检查 wp-content/plugins 是否有不兼容插件,可暂时重命名插件目录排障。
Q6:本服务器当前是 docker run 启动的,如何平滑切换到 Compose?
① docker inspect wordpress 拿到现网参数(本服务器:8080→80、env 连 mysql:3306、卷 wordpress_data);② 按本教程 compose 内容写文件;③ docker stop wordpress && docker rm wordpress 移除旧容器(卷保留);④ docker compose up -d。切换期间站点有短暂停机,建议低峰操作。
docker compose up -d 起 MySQL;本教程 → WordPress 同网络连接 mysql:3306;浏览器访问 IP:8080 完成安装。至此一套「MySQL + WordPress」容器化站点部署完成。



暂无评论内容