Docker 数据持久化Volume

Docker镜像是基于联合文件系统(Union File System)的一种层式结构,由一系列指令一步一步构建出来。Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。

为什么需要Volume为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。数据卷可以带来以下好处:Volume可在容器之间共享或重用数据;Volume的更改可以直接生效;Volume的生命周期一直持续到没有容器使用它为止;对Volume操作不会影响到镜像本身;Volume可以完成容器到宿主机、宿主机到容器以及容器到容器之间的数据共享。Docker volume 有如下几种形态:不使用 Docker volume默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。Data volume (数据卷)一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:(1)使用 “-v 容器内目录” 形式docker run -d -v /data centos /bin/bash使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 data目录了:"Mounts": [{"Type": "volume","Name": "b9697411cd69fde3b5fe471229fc02e70409f8e84edd3333765f441cfb5961f8","Source": "/var/lib/docker/volumes/b9697411cd69fde3b5fe471229fc02e70409f8e84edd3333765f441cfb5961f8/_data","Destination": "/data","Driver": "local","Mode": "","RW": true,"Propagation": ""}],这种情况当容器被删除后,/var/lib/docker/volumes/b9697411cd69fde3b5fe471229fc02e70409f8e84edd3333765f441cfb5961f8/_data目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。(2)使用 -v 来挂载一个主机上的目录到容器的目录docker run -d -v /root/data:/data centos /bin/bash主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。其实这种形式和第一种没有本质的区别,容器内对 /data的操作都会反映到主机上的  /root/data 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /root/data 目录挂载到新的容器内,这样就可以实现数据持久化的目标。使用 docker volume 命令Docker 新版本中引入了 docker volume 命令来管理 Docker volume。(1)使用默认的 'local’ driver 创建一个 volumedocker volume create --name myvolume查看结果:# docker volume inspect myvolume[{"CreatedAt": "2021-04-09T18:39:05+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/myvolume/_data","Name": "myvolume","Options": {},"Scope": "local"}](2)使用这个 volumedocker run -d --name mycentos -v myvolume:/data centos /bin/bash结果将 myvulume 对应的主机上的目录挂载给容器内的 /data 目录。"Mounts": [{"Type": "volume","Name": "myvolume","Source": "/var/lib/docker/volumes/myvolume/_data","Destination": "/data","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],删除 volume可以使用 docker rm -v 命令在删除容器时删除该容器的卷。docker rm -vf mycentos批量删除volume从上面的介绍可以看出,使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理:docker volume rm $(docker volume ls -qf dangling=true)微信号 : TestOps知乎:@TestOps云层

(0)

相关推荐

  • Docker 持久存储介绍(十三)

    一.Docker 数据存储 我们都知道 Docker 的数据可以存在容器的可写层,但是也存在以下几点不足: 当该容器不再运行时,数据将不会持久存储,如果另一个进程需要它,就很难将数据从容器中取出. 容 ...

  • docker容器备份、恢复和迁移volume方案

    volume作为数据的载体,在很多情况下需要对其中的数据进行备份.迁移或是恢复.下面一docker容器的volume为例,说一下备份的技巧. 我们先建立一个容器vol_simple,该容器在/date ...

  • 跟着jimmy学docker系列之第2讲:一个软件一个容器

    ✎✎✎ 回过头来看当初在生信技能树发布的docker教程已经是2017-07-07的事情了,那是一个好日子

  • Portainer

    一.基本介绍 (1)Portainer 是一款轻量级的图形化管理工具,通过它我们可以轻松管理不同的 docker 环境.Portainer 部署和使用都非常的简单,它由一个可以运行在任何 docker ...

  • docker存储volume

    #环境 centos7.4 , Docker version 17.12.0-cedocker volume创建.备份.nfs存储#docker volume数据存容器内,删容器即销毁全部数据要保留的 ...

  • Docker storage driver(十四)

    一.storage driver 作用 正常情况下,只有很少量的数据被写入到容器最上层的写入层,并且通过 volume 来写数据,然而我们也会遇到一些情况需要我们可以直接写入到容器的写入层,这我们就需 ...

  • docker容器与宿主机的数据交互

    在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作.方式一.Docker cp命令 docker cp :用于容器与主机之间的 ...

  • Docker学习笔记之--安装mysql 并持久化数据到本地,最后使用Navicat连接测试(环境:centos7)

    在docker中 安装 mysql 8.0版本,参考文档:https://www.runoob.com/docker/docker-install-mysql.html 第一步:安装 docker p ...

  • docker 数据持久化

    confluence #!/bin/bashdocker run --name confluence --volume "$PWD/data/opt":/opt --volume ...

  • 第46天:Flask数据持久化

    Web 应用离不开数据存储,今天就来学习下 Flask 中如何与数据库交互,最后我们将做一个提交的实例 Flask 中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlcham ...

  • 在Kubernetes中,如何实现数据持久化存储?(内附1.22新版本解读)

    8月4日,Kubernetes发布了1.22版本,作为2021年发布的第二个版本,Kubernetes 1.22 达到了新的巅峰:53处的增强,14个增强已经升级到稳定版本,24个升级到beta版,1 ...

  • Docker定时备份MySQL数据到七牛云

    前言:我Linux服务器安装了docker,docker容器跑了springboot项目,用到了mysql数据库.所以必须准备程序,数据备份功能,万一哪天系统挂了,数据丢了,我可以随时恢复.因为没钱开 ...

  • docker容器与宿主机的数据交互方式总结

    这篇文章主要给大家介绍了关于docker容器与宿主机的数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前言 在生产环境中 ...

  • Docker中的Gitlab数据迁移

    一.选择版本# GitLab 12.2或更高版本:   docker exec -t gitlab-backup create GitLab 12.1和更早版本:   gitlab-rake gitl ...