第九日
上了五天班,期间没有什么进展。但是反思了一下,为什么迁移个博客这么简单的事儿花了三天还没有彻底迁移完。究其原因,还是自己有病,一种叫“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之后其实都不难找到答案:
- Manage Sensitive Data with Docker Secrets及一些更友好的引导文章。
- 看上去有人已经做过了。但是不确定是否适用。
- MySQL Docker Upgrade. 或是参考这里。
- 换Alpine镜像。