容器的生命周期是没有保障的,挂了的话可能随时可能会通过镜像重新创建,如果重新创建容器,那数据就都没有了,那我们存在容器里的数据就很不安全,所以这时候就有了 Volume 的概念可以让我们把某些目录或文件映射到宿主主机,不受容器生命周期而删除掉,当然,如果是要做数据的安全备份那又是另外一个话题了,本文只探讨如何把容器内的数据保存到主机上。
默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:当该容器不再存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。
容器的可写层紧密耦合到运行容器的主机。数据迁移很麻烦。写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供统一的文件系统。与直接写入主机文件系统相比,这种额外的抽象降低了性能 。
因此,如果我们使用容器命令docker rm删除了容器,那么容器中的所有内容均将丢失,包括数据库文件。所以,了解 Docker 中的数据持久性至关重要!那么我们如何在docker中持久保存我们的数据呢?即使关联的容器已经删除的情况下!

一、数据卷
1、数据卷特性
(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
(2)数据卷可以在容器之间共享和重用
(3)可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
(4)对数据卷的更新不会影响镜像的更新
(5)数据卷会一直存在,即使挂载数据卷的容器已经被删除容器数据销毁情况说明。
2、数据卷与容器内数据比较
销毁节点 | 数据卷内数据 | 容器内部数据 |
容器启动 | 保留 | 保留 |
容器暂停 | 保留 | 保留 |
容器重启 | 保留 | 保留 |
容器关闭 | 保留 | 保留 |
容器销毁 | 保留 | 销毁 |
容器转移 | 保留 | 销毁 |
二、数据卷应用
1、挂载一个主机目录作为数据卷
2、数据卷容器
创建数据卷容器的方法:
3、容器的备份
(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




