博客迁移札记——第四日

第九日

上了五天班,期间没有什么进展。但是反思了一下,为什么迁移个博客这么简单的事儿花了三天还没有彻底迁移完。究其原因,还是自己有病,一种叫“Not Invented Here”的病。

当时的逻辑是:”因为服务器不是专门给博客用的,所以不能用特别定制化的WordPress镜像,所以需要自己搭。

这个逻辑看着通,其实只是借口罢了。当时自己,其实心里早就决定想自己做一遍,便借故各种冠冕堂皇的理由来佐证自己的判断罢了。等自己做完,积累了一定的经验之后,再回过头来看时,才能以更公正的心态看态迁移博客这个事儿。

客观地讲,一开始并没有预见到手工搭建WordPress站和数据迁移的过程的复杂度。所以对于不同方案的实施成本的预判失准。所以找了一条自己感觉自己能控制住的道路——手工建站,其它方案都没有多想。

士别三日,重头再来。这次我们用Podman。方便起见,我们先在本地试一下。

如果是服务器端,需要先来安装Podman:

dnf install docker       #CentOS上即是Podman
dnf install podman-compose

然后准备这样的服务声明文件比如叫(stack.yml):

version: '3.1'

services:
  wordpress:
    image: wordpress:5.9
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: admin
      WORDPRESS_DB_PASSWORD: admin123
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin123
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - wordpress_db:/var/lib/mysql

volumes:
  wordpress:
  wordpress_db:

这里需要注意的是,如果不想数据丢的话,一定要挂volume。(问题:这些Volume,如果像这样不明确配置,会放在什么地方呢?这个要搞清楚,否则要备份都不知道要备份哪里。)

然后运行:

docker-compose -f stack.yml up

然后就好了。 就可以在http://localhost:8088/上打开WordPress并进行初始安装了。

这里MySQL和WordPress的版本是明确的,但是WordPress镜像中内置的操作系统和Web Server的版本是不知道的。我们可以连上WordPress的Pod上进行确认。

user@host % docker exec -it ea46d247c5b8 bash

root@ea46d247c5b8:/var/www/html# php --version
PHP 7.4.27 (cli) (built: Jan 26 2022 18:11:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.27, Copyright (c), by Zend Technologies

root@ea46d247c5b8:/var/www/html# apache2 -v
Server version: Apache/2.4.52 (Debian)
Server built:   2022-01-03T21:27:14

root@ea46d247c5b8:/var/www/html# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

root@ea46d247c5b8:/var/www/html# uname -r
5.10.76-linuxkit

这样,我们确认了WordPress镜像中,几个基础组件的版本。

  • PHP 7.4.27
  • Apache 2.4.52
  • Debian 11 (Linux Kernel 5.10.76)

而阿里ECS的服务器上,我手工安装的(最新)版本是这样的:

  • PHP 7.4.19
  • Apache 2.4.37
  • Anolis OS 8.5 (Linux Kernel 4.18.0)

可以发现,最新镜像中自带各个组件,比我自己安装的还要新。(当然,这主要是因为各个Linux发行版的Repo的控制和更新频率不同。)有鉴于Linux Kernel差了一个大版本。还得意了解一下,这个大版本到底更新了什么

而且,更重要的是,WordPress镜像中自带的PHP和Apache,都已经把插件和相关配置做好了,不需要自己再手工安装插件或是手工做任何的配置。比如Apache会配置成在/var/www上AllowOverride,以便固定链接功能能正常工作。(当然,是代码都会有Bug,Image的配置也是代码,也会坏,比如这里可以看到,官方的镜像也出过固定链接坏掉的情况。)

这里其实也有一个问题:原来的ECS,我可以独立升级OS,PHP和Apache,而不会需要重新部署与迁移。但是现在使用Docker镜像,如何更新镜像,又不需要重新做迁移,就会要求把应用数据与运行环境严格剥离。

这样,原第一日工作完成。而且WordPress的健康检查基本正常。(只是中文版ICP备案的选项也还是没有,看来真的是官方不再支持了。)

然后,我们可以开始做数据迁移了。先把老数据导出来,方便起见,直接在本机导。先在本机(MacOS)安装mysql-client(这里有mysqldump):

brew install mysql-client
echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.zshrc

然后执行数据导出:

mysqldump -h <IP> -u admin -p --opt wordpress > wordpress.sql

执行了大概20秒,导出了5MB左右的SQL文件。然后直接导入到新的数据库中:

mysql -h 127.0.0.1 -u root -p wordpress < wordpress.sql

然后,如果有必要,再手工把wp_options表里的siteurl和home的地址及wp_posts里的content更新一下。(前文有讲,这里不再赘述。)

看着这两行命令就可以完成的事儿,回想起第二日,手工在DMS各种跑工单,自己提自己批自己跑自己下载结果的情景。就感觉心里一阵刺痛。

这样,原第二日的工作也基本完成了。(除了图片上传的部分。)

现在快是快了,但是马上就有几个新问题需要解决:

  • stack.yml文件中,有声明数据库密码。是否能去掉?(当然,手工部署的,这个密码是在wp-config.php文件中。也是不安全的。)
  • 在Docker-Compose的启动过程中,如何自动迁移数据?
  • 如何升级wordpress和mysql?甚至OS。
  • 如何在迁移过程中自动传输文件?
  • Docker Image自带OS,用Docker启动了MySQL和WordPress,瞬间2GB空间就没有了。

Google之后其实都不难找到答案:

发表回复