侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 110 篇文章
  • 累计创建 54 个标签
  • 累计收到 2 条评论

Docker 迁移 Chevereto 图床

liveJQ
2022-05-16 / 0 评论 / 0 点赞 / 226 阅读 / 2,304 字 / 正在检测是否收录...

两边的 Docker 版本尽量保持一致,我这边为19.03.15

迁移镜像

制作包含修改数据的镜像文件

docker commit --author livejq --message "Create the chevereto image" chevereto chevereto:v0

导出制作好的镜像到当前目录

docker load -i chevereto

传输到目标服务器后,加载该镜像到本地

docker save -o chevereto chevereto:v0

迁移镜像中挂载的文件或目录

我这边挂载了“/media/pictures/uploads”和“/appdata/chevereto/php.ini”,前者保存上传的图片,后者用来自定义 PHP 启动参数。

这里以图片迁移到目标服务器为例

若还有其他外挂的目录或文件也按照这样迁移过去

➜  ~ rsync -avPz -e 'ssh -p 2222' /media/pictures/uploads/* root@your.server.com:/media/
......
......
......
2022/03/30/9.th.jpg 14,504 100%  143.07kB/s  0:00:00 (xfr#1428, to-chk=0/1450)

sent 122,669,965 bytes  received 27,300 bytes  2,210,761.53 bytes/sec
total size is 125,597,155  speedup is 1.02

迁移数据库

这边使用的是 MySQL,使用 mysqldump 命令导出为 SQL 文件。

mysqldump -uroot -p -B chevereto> /chevereto-backup.sql

加了-B会在导出的SQL文件中自动创建和使用数据库

SCP 传输完成后导入到目标服务器 MySQL

mysql -uroot -p < /chevereto-backup.sql

接着需要创建用户并授权所有主机访问该数据库

mysql> grant all privileges on chevereto.* to "chevereto"@"%" identified by "123456" with grant option;
Query OK, 0 rows affected (0.02 sec)
mysql> flush privileges;

还原容器

这边由于需要访问宿主机的数据库,因此需要获取宿主机映射在容器下的IP地址。

➜  ~ ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0f:d8:d1:c7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

一切准备就绪后,接着开始用尝试创建容器。

下面的数据库信息需要结合自己的环境进行配置

docker run --privileged -d --name=chevereto --network=bridge --restart=always -p 5120:80 -e TZ=Asia/Shanghai -e CHEVERETO_DB_HOST=172.17.0.1 -e CHEVERETO_DB_USERNAME=chevereto -e CHEVERETO_DB_PASSWORD=123456 -e CHEVERETO_DB_NAME=chevereto -e CHEVERETO_DB_PREFIX=chv_ -v /opt/chevereto/php.ini:/usr/local/etc/php/php.ini -v /opt/chevereto/uploads:/var/www/html/images chevereto:v0

在网页尝试访问,检验迁移成果时,出现如下错误信息:

Aw, snap! Internal Server Error [debug @ `error_log`] - https://v3-docs.chevereto.com/setup/debug.html

查看日志信息:

docker logs -f chevereto | sed 's/\\n/\n/g'

其中的关键信息为:

[client 172.17.0.1:52212] G\\DBException: SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.17.0.2' (using password: YES) in /var/www/html/lib/G/classes/class.db.php:99\nStack trace:\n#0 /var/www/html/lib/G/classes/class.db.php(110): G\\DB->__construct()\n#1

这是因为我直接让 chevereto 使用 root 用户来登录 mysql,但 root 仅限于 localhost,所以导致权限不足无法登录成功。解决办法是创建独立用户并授权允许所有主机登录即可。这个已在前面补充创建用户过程,之后就能正常访问了。

这边省略了 Nginx 或 Apache 的相关 Web 服务配置,因与一般的配置无异,顾不再赘述。

相关资料

  1. Chevereto V3
  2. Chevereto-Free Docs
  3. Docker容器的迁移
0

评论区