暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

容器数据持久化

MetaThinking 2019-11-28
449

容器的生命周期是没有保障的,挂了的话可能随时可能会通过镜像重新创建,如果重新创建容器,那数据就都没有了,那我们存在容器里的数据就很不安全,所以这时候就有了 Volume 的概念可以让我们把某些目录或文件映射到宿主主机,不受容器生命周期而删除掉,当然,如果是要做数据的安全备份那又是另外一个话题了,本文只探讨如何把容器内的数据保存到主机上。

默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:当该容器不再存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。

容器的可写层紧密耦合到运行容器的主机。数据迁移很麻烦。写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供统一的文件系统。与直接写入主机文件系统相比,这种额外的抽象降低了性能 。

因此,如果我们使用容器命令docker rm删除了容器,那么容器中的所有内容均将丢失,包括数据库文件。所以,了解 Docker 中的数据持久性至关重要!那么我们如何在docker中持久保存我们的数据呢?即使关联的容器已经删除的情况下!

一、数据卷

Docker在运行时默认会把数据存储到容器的内部,这样就导致了无法从宿主机直接操作容器的数据,通常情况下是以加载数据卷的形式解决。
数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。


1、数据卷特性

(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中

(2)数据卷可以在容器之间共享和重用

(3)可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作

(4)对数据卷的更新不会影响镜像的更新

(5)数据卷会一直存在,即使挂载数据卷的容器已经被删除容器数据销毁情况说明。


2、数据卷与容器内数据比较

      销毁节点

 数据卷内数据

容器内部数据

      容器启动

       保留

        保留

      容器暂停

       保留

        保留

      容器重启

       保留

        保留

      容器关闭

       保留

        保留

      容器销毁

       保留

        销毁

      容器转移

       保留

        销毁


可以上面比较可以看出,在容器销毁和转移的时候容器内部的数据是无法进行保存的,只有数据卷中的数据可以保存。


二、数据卷应用

1、挂载一个主机目录作为数据卷

若在容器中使用主机上的某个目录,可以通过-v参数来指定(注:注意冒号前面的和后面的内容):docker run -it -v hostDirectory:containerDirectory imageName /bin/bash
这就告诉了Docker使用指定的主机路径(hostDirectory)来代替Docker自己创建的根路径并挂载到容器内指定的路径(以上例子为containerDirectory)。需要注意的是,如果主机上的路径不存在,目录将自动在给定的路径中创建。
在用 docker run 命令的时候,可以指定挂载一个本地主机的目录到容器中去,可以使用多次-v选项为一个 docker 容器运行挂载多个本地主机目录。
通过ro的形式创建只读数据卷,使数据卷在容器内只读:docker run -it -v hostDirectory:containerDirectory:ro imageName /bin/bash。


2、数据卷容器

定义一个容器挂载数据卷,其他容器通过挂载这个父容器实现数据共享,挂载数据卷的容器称为数据卷容器。

创建数据卷容器的方法:

启动dc01容器,dc01容器定义为数据卷容器:docker run -it --name dc01 imageName;
dc02继承自dc01:docker run -it --name dc02 --volumes-from dc01 imageName;

数据卷容器可以被多个容器进行挂载,可以实现多容器之间的数据共享。数据卷容器的生命周期一直持续到没有容器挂载他为止。



3、容器的备份

备份容器执行以下命令:docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata; 

(1)首先利用ubuntu镜像创建了一个容器worker

(2)使用–volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷)

(3)使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录

(4)worker容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。



4、容器的恢复

(1)首先创建一个带有数据卷的容器dbdata2:docker run -v /dbdata --name dbdata2 ubuntu:14.04

(2)然后创建另一个新的容器,挂载dbdata2的容器,并使用ubtar解压备份文件到所挂载的容器卷中即可:docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar


到此,容器的数据持久化就介绍完了,在生产环境使用容器的朋友,一定要把容器数据持久化放在首位,希望大家看完后能有所收获。
文章转载自MetaThinking,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论