之前开发时,redis服务安装在windows的docker镜像中,现在需要转移到linux的docker中。问题是,原先redis的一些测试数据也需要导入到linux的redis服务中。
情况大概如下图所示:
实现这个数据迁移,看上去有很多种途径。但实际上,我尝试了一晚上,大费周折才搞定。
尝试1 直接 docker save
结果失败,一方面不包括redis的数据,另一方面windows docker 导出的redis镜像,在ubuntu中启动失败。
尝试2 直接 docker export
结果失败,windows docker 导出的redis容器文件系统,在ubuntu中启动失败。
尝试3 在windows docker中利用redis-cli将redis 1的数据导出
windows开发时,并没有做路径映射,所以不知道如何将windows docker中的文件导入宿主机。看网上说,可以利用 docker commit 实现,但我尝试了一下,没有成功。 docker commit貌似是一种增量生成镜像的方法,一时半会没弄懂。
尝试4 在 windows 宿主机中利用redis-cli将redis 1的数据导出
这个应该是可行的,但windows中并没有安装redis-cli,遂作罢。
尝试5 利用docker cp 复制指令
成功!思路是将redis数据文件拷贝到宿主机中,然后利用 vmware 的文件共享功能和docker的路径映射,将该数据文件拷贝到redis 2中。步骤大概为
- 在windows docker中用redis-cli的save指令,将redis数据保存在dump.rdb中。
- 在window docker中,利用下面指令,拷贝数据到宿主机中。
docker cp containerID:/data/dump.rdb D:/share
- 打开 vmware 的文件共享功能。
- 在ubuntu的docker中(开启了路径映射,所以能够直接访问共享文件夹),将dump.rdb拷贝到 /data路径中,替换redis 2 自身的数据.
- 在ubuntu的docker的redis-cli 中,输入
redis-cli shutdown nosave
指令,退出redis服务,并且不保存数据,不然拷贝过来数据会被篡改。
有人可能会说,为什么不先停止redis服务,然后再拷贝替换数据。原因是一旦停止redis服务,容器就自动退出了,无法完成步骤4.
可见,一个简单的数据迁移,真正实施起来,还是有很多坑的。
网友评论