自己学Docker:5.Docker的数据持久化之数据卷

首先,别忘记之前的两个问题:

1. 如何保存我们在容器里的修改?

2. 如果apt-get如果不能安装时,如何在Docker中安装软件?

删除镜像命令

在此之前,先记一个命令,

sudo docker rm ID/NAME

即删除创建的镜像.如

现在删除id为”cc8a23b1d624”的镜像.

sudo docker rm cc8a23b1d624

可以看到,id为cc8a23b1d624的镜像被删除了.

而且可以发现,本地的/var/lib/docker/containers目录下的对应目录也被删除了.

下面讨论Docker的数据持久化.

数据卷

数据卷的创建

官方的解释是:数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS.

UFS即是UNIX文件系统的简称.

  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会立马生效
  3. 对数据卷的更新,不会影响镜像
  4. 数据卷默认会一直存在,即使容器被删除

    数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

    如创建容器时使用参数v指定一个目录,

sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash

这样我们挂载了一个数据卷.如果/home/mungo/workspace/docker/container_data目录不存在,Docker会自动创建该目录.

上面的命令就是将container_data挂在到了容器的/data下.在容器中可以看到:

上次,了解到如何查看容器详情的方法,即:

sudo docker inspect DataTest

这里”DataTest”即是刚才创建容器指定的名称.上面返回的json格式的容器信息,查看Mounts节点数据.如下:

可以看到Mounts下正是我们创建时指定的目录.

这个功能十分方便,像之前的第二个问题–如果apt-get如果不能安装时,如何在Docker中安装软件?这时用户可以放置一些程序到本地目录中,然后就可以安装了。注意的是本地目录的路径必须是绝对路径

比如我将一个文件vscode-amd64.deb复制到挂在的目录,然后在docker的容器中就可以直接看到了.

值得注意的是:Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data:ro docker/whalesay /bin/bash

至此,之前的留下的问题算是解决了一个.

数据卷的数据共享

那么既然可以将本地的目录挂在到Docker容器中,挂载的数据卷是否可以再被其他的Docker容器使用呢?

sudo docker run -i -t --name DataTest2 -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash

可以发现name为”DataTest”和”DataTest2”的容器都是启动的.同时他们挂在了宿主主机的同一个目录,在各自的容器中看到的是一一致的.

然后在”DataTest2”创建一个文件–“test.txt “,在去查看”DataTest”的挂在目录和宿主本地的被挂载目录,发现新建的”test.txt”文件都存在.

之后再在”DataTest”修改文件”test.txt”增加”hello”.分别取三个地方查看,发现三个地方的结果是一致的.

数据卷的删除

通过上面的介绍可以了解到:数据卷是被设计用来持久化数据的.那么,它的生命周期和容器有什么关系?删除容器数据卷会不会被连带删除?

下面我退出容器DataTest2并删除它.

在容器DataTest和宿主本机本地中查看上面挂在的数据卷.

可以发现,在容器DataTest和宿主本机本地之前的更改都在.

所以,数据卷的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,同时也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。

如果需要在删除容器的同时移除数据卷。查到资料说可以在删除容器的时候使用 docker rm -v 这个命令。可是我尝试了没有成功,不知什么原因.

不过这些无主的数据卷可能会占据很多空间,要清理会很麻烦。但是Docker官方正在试图解决这个问题,相信以后会有简便的方法,关于这个问题的进度,现在可以查看这个Pull requests .

这次解决掉了如果apt-get如果不能安装时,如何在Docker中安装软件这个问题.可是关于Docker的学习,随着深入,月觉得还有很多东西需要了解.以后继续吧.

时间: 2024-10-25 03:41:42

自己学Docker:5.Docker的数据持久化之数据卷的相关文章

Android基础知识(6)—数据持久化之数据存储

阅读前,请浏览此处上方目录. Android基础知识(6)-数据持久化之数据存储 本章内容为个人笔记,参考书籍有:<疯狂的android>第3版.<第一行代码> 首先,我们要知道什么是数据持久化. 数据持久化就是指那些内存中的瞬时数据保存到存储设备中,保证即使手机在关机的情况下,这些数据不会丢失.保存在内存中的数据是处于瞬时状态,保存在存储设备中的数据是处于持久状态.持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换. Android系统主要提供了三种方式用于简

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

Cocos2d-x数据持久化-修改数据

修改数据时,涉及的SQL语句有insert.update和delete语句,这3个SQL语句都可以带参数.修改数据的具体步骤如下所示.(1) 使用sqlite3_open函数打开数据库.(2) 使用sqlite3_prepare_v2函数预处理SQL语句.(3) 使用sqlite3_bind_text函数绑定参数.(4) 使用sqlite3_step函数执行SQL语句.(5) 使用sqlite3_finalize和sqlite3_close函数释放资源.这与查询数据少了提取字段数据这个步骤,其他

Cocos2d-x数据持久化-查询数据

数据查询一般会带有查询条件,这可以使用SQL语句的where子句实现,但是在程序中需要动态绑定参数给where子句.查询数据的具体操作步骤如下所示.(1) 使用sqlite3_open函数打开数据库.(2) 使用sqlite3_prepare_v2函数预处理SQL语句.(3) 使用sqlite3_bind_text函数绑定参数.(4) 使用sqlite3_step函数执行SQL语句,遍历结果集.(5) 使用sqlite3_column_text等函数提取字段数据. (6) 使用sqlite3_f

docker容器实现数据持久化的两种方式及其区别

前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此行重点标注的原因就是我在面试中被问到过:docker使用的是什么文件系统?),通过docker info命令可以查看出主机上docker相关的信息,包括支持的网络类型.系统版本.内核版本.docker主机的cpu.内存等信息.如下: 在docker中实现数据持久化有两种方式:Bind mount和D

k8s数据持久化

k8s数据持久化 Docker容器是有生命周期的,因此数据卷可以实现数据持久化 数据卷主要解决的问题: 数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失 数据共享:在同一个Pod中运行容器,会存在共享文件的需求 存储类(Storage class)是k8s资源类型的一种,它是有管理员为管理PV更加方便创建的一个逻辑组,可以按照存储系统的性能高低,或者综合服务质量,备份策略等分类.不过k8s本身不知道类别到底是什么,

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

UI_19 数据持久化(本地存储)

一.数据持久化概述 数据持久化就是数据的永久存储.其本质是将数据保存为文件,存到程序的沙盒中. 1.数据持久化的方式 1.1 writeToFile:简单对象写入文件 1.2 NSUserDefaults:应用程序偏好设置1.3 Sqlite:轻量级关系型数据库,不能直接存储对象(NSData除外),需要用到一些SQL语句,先将复杂对象归档(对象->NSData) 1.4 CoreData:对象型数据库,实质是将数据库的内部存储细节封装 1.5 Plist文件 2.应用程序沙盒 每一应用程序都有

iOS 两行代码解决数据持久化

在实际的iOS开发中,有些时候涉及到将程序的状态保存下来,以便下一次恢复,或者是记录用户的一些喜好和用户的登录信息等等. 这就需要涉及到数据的持久化了,所谓数据持久化就是数据的本地保存,将数据从内存中迁入到存储器上.网上有很多种数据持久化的方法,如实现自己实现I/O.数据库.云或则走第三方接口等等.但是有时候可能只是进行一些简单的数据存储,如用户的偏好设置.用户的sessionID等等,这时候使用上述方法便显得有点兴师动众了,现在需要一种更加轻量化的操作方式. 一.认识 NSUserDefaul