两边的 Docker 版本尽量保持一致,我这边为19.03.15
迁移镜像
制作包含修改数据的镜像文件
docker commit --author livejq --message "Create the chevereto image" chevereto chevereto:v0
导出制作好的镜像到当前目录
docker save -o chevereto chevereto:v0
传输到目标服务器后,加载该镜像到本地
docker load -i chevereto
迁移镜像中挂载的文件或目录
我这边挂载了“/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 服务配置,因与一般的配置无异,顾不再赘述。
评论区