目前的Blog托管在同事的一个共享主机上,由于种种原因,这个主机即将无法使用,我只能再次迁移我的WordPress,不得不感叹:铁打的Wordpress,流水的主机啊!

这次迁移前,我仔细考量了一番,如何能让以后可能出现的Wordpress迁移最简化呢?虽然现在的迁移也不是特别复杂。我想到了近期研究的 Docker。目前很多国外的VPS都已经支持了Docker,我只需要在本地制作好Docker容器导出,再导入目标VPS的Docker中即可完成迁 移。在真正做迁移前,我打算在实验环境下测试一下。以下是将Wordpress迁移到Docker容器的测试过程。

一、容器准备

1、下载镜像

WordPress主要就是两个部分组成:wordpress程序 + mysql数据库。Docker官方registery提供了Wordpress和MySQL的image,我们可以直接pull使用。考虑到外站速度较 慢,这里我使用了国内镜像站点dockerpool.com提供的镜像了。

sudo docker pull dl.dockerpool.com:5000/wordpress:4.0.0
sudo docker pull dl.dockerpool.com:5000/mysql:5.6.20

考虑到使用phpmyadmin操作mysql数据的方便性,我又找了一个phpmyadmin的image:

sudo docker pull corbinu/docker-phpmyadmin

2、启动容器

mysql作为数据库数据存储镜像,在启动是会被wordpress和phpmyadmin link的,这样后两者在各自容器内才能顺利访问mysql服务和数据库。

按顺序启动容器(mysql为最先启动):
sudo docker run –name blogmysql -e MYSQL_ROOT_PASSWORD=root -d dl.dockerpool.com:5000/mysql:5.6.20
sudo docker run –name blogwordpress –link blogmysql:mysql -p 80:80 -d dl.dockerpool.com:5000/wordpress:4.0.0
sudo docker run –name blogphpmyadmin -e MYSQL_USERNAME=root –link blogmysql:mysql -p 8000:80 -d corbinu/docker-phpmyadmin

三个容器均可以顺利启动。mysql数据库的访问方式是root/root。wordpress默认为80端口,phpmyadmin用8000端口访问,你可以试试http://localhost:80和http://localhost:8000。

$ sudo docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS                  NAMES
a30540120b5d        corbinu/docker-phpmyadmin:latest      "/bin/sh -c phpmyadm   5 seconds ago       Up 3 seconds        0.0.0.0:8000->80/tcp   blogphpmyadmin     
a88c456bf840        dl.dockerpool.com:5000/wordpress:4    "/entrypoint.sh apac   37 seconds ago      Up 35 seconds       0.0.0.0:80->80/tcp     blogwordpress      
1b6f84f428e3        dl.dockerpool.com:5000/mysql:5.6.20   "/entrypoint.sh mysq   45 seconds ago      Up 44 seconds       3306/tcp               blogmysql  

访问phpmyadmin,使用root/root登录后,我们可以看到主页上得数据库信息:

Database server

Server: 172.17.0.2 via TCP/IP
Server type: MySQL
Server version: 5.6.20 – MySQL Community Server (GPL)
Protocol version: 10
User: root@172.17.0.4
Server charset: UTF-8 Unicode (utf8)
Web server

nginx/1.7.1
Database client version: libmysql – 5.6.20
PHP extension: mysqli Documentation
phpMyAdmin

Version information: 4.2.7.1, latest stable version: 4.2.10.1

3、install wordpress

第一次通过http://locahost:80访问wordpress,便进入了wordpress安装流程,这个镜像中携带的版本是wordpress 4.0.0。

step1:
    选择安装语言:简体中文

step2:
    填写站点名称、用户名、密码、邮件等。

安装ok后,你就进入到了Wordpress 4.0.0的管理后台。
 

二、迁移

1、导出备份

目前的Blog使用的是DirectAdmin管理面板。通过DirectAdmin我们可以将当前的Wordpress站点整个下载,下载包中包含:

$ls
backup/        domains/

domains/tonybai.com/public_html下就是你的wordpress程序以及相关配置、插件等数据。
backup/xxx.sql就是数据库导出文件。

我们需要将这两部分恢复到Docker中。

2、数据表导入

我曾经试过通过WP-DB-Backup导出sql文件,再通过phpmyadmin导入的方法,但WP-DB-Backup导出的sql文件较大(>2M),无法满足phpmyadmin对导入文件的要求(<=2m),于是总是失败。之后决定通过mysql直接执行sql脚本导入。

首先通过phpmyadmin在mysql中建立数据库xx_db,编码:utf8_general_ci。

然后将上面的backup/xxx.sql拷贝到blogmysql容器中,比如就放在/root/下。然后通过nscenter进入到blogmysql容器中,切换到/usr/local/mysql/bin下,执行如下命令:

$ ./mysql -u root -p
输入root,进入mysql

在mysql下执行:
mysql > use xx_db
mysql > source /root/xxx.sql

如无意外,数据将顺利导入mysql的xx_db下。

3、wordpress导入

通过docker nsenter工具进入blogwordpress容器,进入/var/www目录下:

$ cp -r html html.bak
$ rm -fr html/*

再将上面提到的public_html下面的文件悉数copy到html下。

打开浏览器,输入http://localhost:80,会出现错误提示:"您在 wp-config.php 文件中提供的数据库用户名和密码可能不正确,或者无法连接到 localhost 上的数据库服务器"。

我们需要修改wp-config.php中的数据库连接信息。

define('DB_NAME', 'bigwhite_db');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'mysql');

再次刷新浏览器,依旧无法正确打开。重启blogwordpress容器后,wordpress终于可以打开了,但打开的wordpress管理页面连接 的数据库不对,我的文章并没有出现在文章列表中,这是一个新库。于是通过docker logs查看blogwordpress日志,进入blogwordpress查看wp-config.php的内容,我惊奇的发现:wp- config.php中的DB_NAME被改回'wordpress'了,而没有使用导入的"bigwhite_db"。

多次修改回bigwhite_db并重启容器后,这个值均被改为wordpress。无奈只好通过phpmyadmin删除wordpress库,重新创 建wordpress库并采用同样方法导入xx.sql,使得wordpress这个db与bigwhite_db拥有同样地内容。这回再打开 wordpress,一切尽在眼前。

迁移实验成功!这样我们将迁移后的容器导出,再导入你的支持docker的VPS中,无需任何其余操作即可完成真正的迁移。目前Digital Ocean已经支持了Docker,Aliyun据说也拥抱了Docker。

© 2014, bigwhite. 版权所有.

Related posts:

  1. Ubuntu Server 14.04安装docker
  2. 探讨docker容器对共享内存的支持情况
  3. docker容器内服务程序的优雅退出
  4. Review Board中文支持
  5. 探讨Docker容器中修改系统变量的方法