Docker存储位置迁移.html

Posted by AlstonWilliams on February 17, 2019
Docker存储位置迁移

Docker存储位置迁移

今天本来想给各位介绍一下Spring Boot,但是因为后面一直在尝试迁移Docker存储位置,而且觉得这个意义比较大.就暂且先介绍一下如何迁移Docker的存储位置.以后有时间,在介绍Spring Boot.

前面<由Docker垃圾回收机制引起的一场血案>这篇文章中,我们已经说过,因为Docker的文件太多,将我们的服务器上的硬盘空间给耗尽了.同时,也提到了一种解决方案,就是将Docker的存储位置迁移到一个更大的硬盘上.

这不,这两天,我们加了一块较大的硬盘,就想将Docker的数据迁移一下.

目标

因为/var文件夹最大,所以我们打算将这个文件夹迁移到那台新的硬盘上.

Docker数据的文件夹是/var/lib/docker.所以,迁移/var文件夹,Docker数据也会跟着迁移.

具体过程

首先,先停掉全部的Docker容器:


然后,我们还需要停掉Docker daemon:sudo service docker stop

由于是新加的硬盘,我们需要给它进行分区以及格式化操作,否则用不了.

进行如下图所示的操作:


当然,如果你是一块全新的硬盘,这里肯定跟上图不一样.分区号你的应该默认是1,也不会有下面的那句没有空闲扇区可用.

新建完这个分区之后,我们需要对其进行格式化.这里我们将其格式化为ext3:


输入上面的那条命令之后,我们需要耐心等待一段时间.

有读者可能注意到,上面的命令中,我们使用的分区是/dev/xvdb1,而不是/dev/xvdb./dev/xvdb1是一个分区,是对/dev/xvdb这块硬盘分区得来的.不要把两者搞混.

同样,这里格式化的分区,以你实际创建的分区为标准.

然后,我们在根目录下新建一个临时目录/data,这个目录相当于中转站,只是/dev/xvdb1这个物理分区在逻辑目录树上的一个表现而已.

mkdir /data

我们将/data这个中转站目录与我们的物理分区挂载起来:


然后将/var这个目录中的内容原封不动得拷贝到这个中转站目录中.这样就相当于我们把/var目录中的内容都拷到了/dev/xvdb1这个分区来了.对吧?


这条命令会将/var目录中的内容,原封不动的拷贝到/data目录中.包括文件的各种属性,如权限,时间戳等.

这里我们需要耐心等待,随着你的/var目录的增大,拷贝的时间也会增长.

拷过来之后,其实我们的数据迁移工作就完成了.因为此时Docker的数据已经完好无误的拷贝到/dev/xvdb1这个分区中了.我们完全可以通过在Docker的配置文件中指定数据存储的目录为/data/lib/docker,以后都使用这块新的硬盘来存储或者读取Docker的数据.编辑/etc/default/docker:


然后再重启Docker daemon.你可以看到一切都没有问题.使用docker start命令启动容器,应该也是没有问题的.

然而,我们是将整个/var目录中的内容都复制过来了,因为我们的目标是将/var目录中的内容放到另一个硬盘上.那我们就需要做下面的额外的步骤了.

先将原来的/var改一个名字,如/var.old:


然后,再新建一个/var文件夹:


然后,将上面的/data卸载掉,并将/dev/xvdb1这个分区挂载到新创建的/var上:



如果你再执行umount命令时,遇到Device is busy的问题,可以通过下面的命令来解决:


它会杀掉那些跟/data文件相关的进程.然后在umount应该就没有问题了.

我们还需要最后一步,就大功告成了.编辑/etc/fstab,在文件的最后加入下面的/dev/xvdb1开头的那行:


这样我们就完整的将第一块硬盘上的移动到第二块硬盘上啦.

我们启动完docker daemon,再启动起来那些Docker容器,就可以正常使用啦.