Docker 安装 WordPress 并快速手动迁移所有数据
运行环境选择:裸机环境 -> Docker
主要软件选择:NGINX,MariaDB,phpMyAdmin
由于 Mysql 所需内存过多,原先的服务器配置已无法支持运行。
因此在 DigitalOcean 上购买了新的配置的服务器,并决定使用Docker部署,方便管理。
就我观察而言,目前暂无完整的相关教程,在这里做一个简述。
前述
关于Web服务器与数据库程序的选择:
Nginx 和 Apache 各有什么优缺点?,MariaDB和MySQL全面对比
参考资料(主要的):
How To Install WordPress With Docker Compose,Running WordPress with MariaDB
准备工作(你需要什么)
- 一台尚在正常运行 WordPress 的服务器
- 一个等待部署的环境(可以是同一台服务器,但因为可能需要短暂运行两套完整的WordPress服务,可能需要较多的内存 >= 1G)
安装 Docker
APT 安装 Docker 软件包
参考 官方教程 安装。
PS:请安装 docker-ce 而非 docker.io,原因:What is docker.io in relation to docker-ce and docker-ee?
给予登录用户 Docker 操作权限
参考 官方文档
sudo groupadd docker
sudo usermod -aG docker $USER
编写配置文件
创建一个存放所有配置文件的文件夹
mkdir -p $HOME/.config/wordpress
编写 Docker 配置文件(配置仅供参考,请仔细配置信息解释部分)
$HOME/.config/wordpress/docker-compose.yml
version: '3'
services:
db:
image: mariadb
container_name: mariadb
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=wordpress
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
wordpress:
depends_on:
- db
image: wordpress:fpm
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
volumes:
- wordpress:/var/www/html
networks:
- app-network
webserver:
depends_on:
- wordpress
image: nginx
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- wordpress:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- app-network
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- wordpress:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email --force-renewal -d example.com -d www.example.com
volumes:
certbot-etc:
wordpress:
dbdata:
networks:
app-network:
driver: bridge
$HOME/.config/wordpress/.env
MYSQL_ROOT_PASSWORD=XXXXXXXX
MYSQL_USER=wordpress
MYSQL_PASSWORD=XXXXXXXX
$HOME/.config/wordpress/.dockerignore
.env
.git
docker-compose.yml
.dockerignore
配置信息解释
.dockerignore
我的理解是类似于 .gitignore 用来忽略非必要的文件
.env
一个简单的文件,用来存储待会需要使用的环境变量,叫做其他名字或者不创建该文件均可
MYSQL_ROOT_PASSWORD=XXXXXXXX (填入初始 Root 密码)
MYSQL_USER=wordpress (填入 wordpress 数据库操作用户名,可以自由填写)
MYSQL_PASSWORD=XXXXXXXX (填入上面那个用户的初始密码)
# 建议使用**密码生成器**生成足够安全的密码
docker-compose.yml
用来编排 Docker 镜像。用来描述 Docker 镜像之间的依赖关系及启动它们所设置参数。简言之,就是为了避免手动输入过多的命令,减少操作复杂程度。
使用 docker-compose 替代 docker run
申请 HTTP 证书
Let’s Encrypt 的 HTTPS证书是只要你的Web服务器正常运行就能获得的,所以,我们接下来让 NGINX 能够正常运行。
编写 NGINX 配置(只为了获取证书用)
参考 How To Install WordPress With Docker Compose
创建文件夹
mkdir -p $HOME/.config/wordpress/nginx-conf
$HOME/.config/wordpress/nginx-conf/nginx.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
index index.php index.html index.htm;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
运行容器
进入 docker-compose.yml 所在文件夹
cd ~/.config/wordpress
运行容器
docker-compose up -d
你将会看到:
Creating db ... done
Creating wordpress ... done
Creating webserver ... done
Creating certbot ... done
检查容器状态
docker-compose ps
确认 测试用HTTPS证书 已获得
docker-compose exec webserver ls -la /etc/letsencrypt/live
再次运行单独 cerbot
docker-compose up --force-recreate --no-deps certbot
配置 NGINX
参考 How To Install WordPress With Docker Compose
停止 nginx 服务
docker-compose stop webserver
下载 CertBot 预置的 NGINX SSL 配置文件
curl -sSLo nginx-conf/options-ssl-nginx.conf https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf
编辑 nginx.conf (务必替换掉example.com)
完整的 NGINX 配置包括 HTTP 重定向到 HTTPS 和 SSL 配置。
WordPress 安装完成
到这里,WordPress 的 Docker 环境已经安装完成了。
现在在浏览器上访问你服务器的 IP,应该可以正常看见 WordPress 欢迎界面。
之后的内容是关于网站完整的数据快速迁移部分。
WordPress 数据迁移
数据库迁移
参考 官方文档
这里选用 phpMyAdmin 作为数据库操作工具
数据库备份
安装 phpMyAdmin
- APT 安装 phpmyadmin
sudo apt install phpmyadmin
- 关联 phpMyAdmin 至 Web 服务器
ln -s /uer/share/phpadmin /var/www/html/phpadmin
- 访问 phpMyAdmin
在浏览器上访问 http://
导出 WordPress 数据库
- 选中 WordPress 数据库(你所需要导出的数据库)

- 点击”导出”按钮

- 点击”执行”,下载备份文件到本地。
数据库导入
安装 Docker 版本 phpMyAdmin
- 确认 docker 内部网络连接
docker network ls
- 运行 phpMyAdmin
docker run --name myadmin -d --link mariadb:db -p 8081:80 --net wordpress_app-network phpmyadmin/phpmyadmin
Docker 会尝试运行镜像(如果不存在会自动下载),将 phpMyAdmin 与 MariaDB 数据库相链接,并将容器绑定在 wordpress_app-network 中,同时将 Web 访问端口绑定在宿主机的公网 8081 端口。
- 访问 phpMyAdmin
在浏览器上访问 http://
导入 WordPress 数据库
- 选中 WordPress 数据库(你所需要导入的数据库)

- 点击”导入”按钮

- 上传备份文件
- 点击”执行”
网站文件迁移
网站文件包括了你所安装的插件,你所上传的图片等资源文件。
WordPress 文件备份
SSH 登录老的服务器
ssh -p <你的ssh端口> <你的ssh登录用户名>@<你的旧服务器IP>
- 确认网站文件位置
ls -la /var/www/html/wordpress
- 打包网站文件
sudo tar -czvf ~/html.tar.gz /var/www/html/
- 修改备份压缩包权限(便于下载)
sudo chown $USER:$USER html.tar.gz
- 退出SSH登录
exit
下载备份压缩包
scp -r -P <你的ssh端口> <你的ssh登录用户名>@<你的旧服务器IP>:~/html.tar.gz ./
WordPress 文件恢复上传备份压缩包
上传备份压缩包
scp -r -P <你的ssh端口> ./html.tar.gz <你的ssh登录用户名>@<你的新服务器IP>:
SSH 登录新的服务器
- 解压备份压缩包
tar -xzvf ~/html.tar.gz
- 传入备份文件到 Docker 数据卷
docker cp ~/var/www/html wordpress:/var/www
- 进入 docker-compose.yml 所在文件夹
cd $HOME/.config/.wordpress
- 检查传入文件
docker-compose exec webserver ls -la /var/www/html/
- 修复网站文件权限
docker-compose exec wordpress chown -R www-data:www-data /var/www/html
修复 WordPress 数据库读取
编辑 wp-config.php 文件
cd $/HOME/var/www/html/wordpress
vim wp-config.php
修改以下部分 与你之前在 .env 文件中设置一致
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');
/** MySQL数据库用户名 */
define('DB_USER', 'wordpress');
/** MySQL数据库密码 */
define('DB_PASSWORD', '123456');
/** MySQL主机 */
define('DB_HOST', 'db:3306');
覆盖 WordPress 数据卷 wp-config.php 文件
docker cp wp-config.php wordpress:/var/www/html/wp-config.php
WordPress 数据恢复完成
- 关闭 phpMyAdmin
docker stop myadmin
为保证数据库安全,请务必停止,只在需要调试时开启。
后记
此次数据迁移主要把握两个方向:环境架设(测试可用)、数据备份(确定相关文件)。
可能会出现的错误及解决方案
- 新网站运行正常,但访问不显示信息(空白)。
原因:数据库已导入,且正常运行,网站数据未导入成功。
-
其他问题,请注意以下事项
-
请在未导入配置的情况下检查网站是否正常运行。
-
WordPress 的问题主要是文件与数据库的匹配。
排查方法:
- 查看Docker日志
docker-compose logs service_name - 使用 phpMyAdmin 检查数据库与用户是否正常