为知笔记Docker版介绍

官方的Docker镜像十分复杂,在一个docker镜像中运行了诸多程序,通过pm2管理各个进程。

为了数据的可靠性,并且甲骨文提供了免费的单核1g的服务器,就拿它单独跑个数据库吧。

安装外部数据库的过程就不赘述了,直接开始迁移。

1.docker镜像的entrypoint分析

首先,通过官方的命令启动镜像:

docker run --name wiz --restart=always -it -d -v  ~/wizdata:/wiz/storage -v  /etc/localtime:/etc/localtime -p 80:80 -p 9269:9269/udp  wiznote/wizserver

先把docker镜像的启动脚本复制出来。

docker cp wiz:/wiz/app/entrypoint.sh .

通过entrypoint.sh的L25-L33行,发现wiznote数据库加载了一个插件,鉴于我们对这个插件没有更多的信息,所以外部数据库最好采用相同的版本。

# mysql
echo "-----------------copy mysql config-----------------"
if [ "$isUbuntu" = true ]; then
  mkdir /nonexistent
  cp -fr /wiz/config/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
  cp /wiz/app/wizserver/libwizsqlcjk.so /usr/lib/mysql/plugin/
else
  cp -fr /wiz/config/my.cnf /etc
  cp /wiz/app/wizserver/libwizsqlcjk.so /usr/lib64/mysql/plugin/
fi

把这个插件从镜像中先复制出来,然后注释这一段代码。

docker cp wiz:/wiz/app/wizserver/libwizsqlcjk.so .

这里是我提取好的mysql plugin:

libwizsqlcjk(x86_64)
libwizsqlcjk(arm64)

在第84行,会启动mysql,也注释掉

L91-L92行会检测本地mysql的连通性,这里修改下,让他检测远程mysql的连通性。将IP地址替换为外部的mysql地址。

将L102的mysql连接情况检测,替换为外部mysql地址和账号密码

# mysql -uroot -paI9DCyNpEKWe9pn5 -e "show databases;"
mysql -h 10.0.0.136 -uwiznote -p123456 -e "show databases;"

注释L105-L133行,关于mysql进程检测的代码

注释L137行,在检测到内部mysql启动失败时,不退出。

注释 L140-L154行的代码,外部mysql数据库无需进行升级操作。

在看到159行的代码时,发现wiz官方是计划支持外部数据库的,只需要传递相应的环境变量,即可使用外部数据库。

因此在启动docker镜像时,传入相应的环境变量即可。例如:

docker run -it --name wiz \
  --restart=always \
  -v ~/wizdata:/wiz/storage \
  -v /etc/localtime:/etc/localtime \
  -p 80:80 \
  -p 9269:9269/udp \
  -e MYSQL_EXTERNAL_HOST=1.2.3.4 \
  -e MYSQL_EXTERNAL_USER=wizuser \
  -e MYSQL_EXTERNAL_PASSORD=123456 \
  -e MYSQL_EXTERNAL_PORT=3306 \
  -d wiznote/wizserver

注意,这几个环境变量缺一不可

2.导出内部mysql数据库

在上面的启动脚本里,发现为知笔记的镜像中使用了root账户,并使用了多个数据库。

因此,我们要导出全部的数据库,并赋予外部数据库中相应的账户权限。

docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 editor_ot > /data/editor_ot.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wiz_db_scheme_info > /data/wiz_db_scheme_info.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wiz_message > /data/wiz_message.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wiz_share > /data/wiz_share.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wizasent > /data/wizasent.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wizksent > /data/wizksent.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wizkv > /data/wizkv.sql
docker exec -it wiz mysqldump -uroot -paI9DCyNpEKWe9pn5 wizmail > /data/wizmail.sql

注意检查下每个导出的SQL文件,第一行是否有相关的Warning,如果有需要删除,否则导入时会报错。

3.导入至外部数据库

首先将libwizsqlcjk Plugin和相关的数据库备份文件传入外部mysql所在的服务器上。

启用Mysql libwizsqlcjk Plugin,注意cpu架构

mv libwizsqlcjk.so /usr/lib/mysql/plugin/
systemctl restart mysql
# 登录 mysql 后启用改插件
INSTALL PLUGIN wizcjk SONAME 'libwizsqlcjk.so';

导入数据库

cat editor_ot.sql | mysql -u root -p editor_ot
cat wiz_db_scheme_info.sql | mysql -u root -p wiz_db_scheme_info
cat wiz_message.sql | mysql -u root -p wiz_message
cat wiz_share.sql | mysql -u root -p wiz_share
cat wizasent.sql | mysql -u root -p wizasent
cat wizksent.sql | mysql -u root -p wizksent
cat wizkv.sql | mysql -u root -p wizkv
cat wizmail.sql | mysql -u root -p wizmail

授权相关的Mysql账户,注意替换Mysql账户的IP地址

grant all privileges on editor_ot.* to 'wiznote'@'1.1.1.1';
grant all privileges on wiz_db_scheme_info.* to 'wiznote'@'1.1.1.1';
grant all privileges on wiz_message.* to 'wiznote'@'1.1.1.1';
grant all privileges on wiz_share.* to 'wiznote'@'1.1.1.1';
grant all privileges on wizasent.* to 'wiznote'@'1.1.1.1';
grant all privileges on wizksent.* to 'wiznote'@'1.1.1.1';
grant all privileges on wizkv.* to 'wiznote'@'1.1.1.1';
grant all privileges on wizmail.* to 'wiznote'@'1.1.1.1';
FLUSH PRIVILEGES;

迁移结束,启动后就可以正常使用外部数据库了。