一.Docker数据卷

Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重启时,之前的修改将会丢失。在Docker中,只读层和顶部的读写层的组合被称为联合文件系统(Union File System)。

Docker镜像可以理解成多个只读文件叠加而成,因此镜像是只读的,当镜像运行起来时,就相当于在只读的镜像外包裹了一层读写层变成了容器。当删除容器之后,使用镜像重新创建一个容器时,此时的镜像的只读层和原来一样,只是在读写层的修改会全部丢失。

Docker提供了三种不同的方式,用于将宿主机的数据挂载到容器中:

  • volumes:器内的数据被存放到宿主机(linux)一个特定的目录下(/var/lib/docker/volumes/)。这个目录只有Docker可以管理,其他进程不能修改。如果想持久保存容器的应用数据,Volumes是Docker推荐的挂载方式。
  • bind mounts:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统目录或文件中。除了Docker之外的进程也可以任意对他们进行修改。
  • tmpfs:容器的数据只会存放到宿主机的内存中,不会被写到宿主机的文件系统中,因此不能持久保存容器的应用数据。

1.1 volumes

Volumes:

  • 由Docker进程创建和管理,可以通过命令docker volume create来创建一个指定的卷,也可以由Docker进程在创建容器或服务的过程中来创建。
  • 当为一个容器创建一个volume时,这个volume将会被存储到宿主机的一个目录下,当你挂载这个volume到一个容器中时,就是在挂载这个目录到容器中。
  • 一个volume可以被同时挂载到多个容器中。当没有任何容器在使用这个volume的时候,这个volume也仍然可以被Docker进程所使用,而不是自动删除。当前这里可以使用命令手动删除volume:docker volume prune
  • 当你挂载一个volume时,可以选择为它命名,也可以不命名。如果不命名的话,当这个volume首次被挂载到一个容器中时,Docker进程会分配给他一个随机的名字,以保证在宿主机操作系统中这个volume的名字唯一。除了名字之外,命名和不命名的volume没有区别。
  • volume也支持使用volume drivers,以帮助你将数据保持到远程主机或云上。

Volumes是Docker管理宿主机文件系统的一部分,默认位于/var/lib/docker/volumes目录中:



由上图可以看出,目前所有的Container数据都保存在了这个目录下,由于没有在创建的时候指定卷,所以Docker帮我们创建了许多匿名的卷(就是一堆很长ID名字的卷)

适用场景:

  • 多个容器间需要共享数据。如果volume没有手动被创建,它将会在首次挂载到某个容器之前被自动创建,当容器被停止或删除时,这个volume不会随之被删除。多个容器可以同时以rw或ro的方式挂载这个volume。只有手动指定删除volume,它才会被删除。
  • 当宿主机并没有专用于Docker的文件系统结构时。使用volume可以使宿主机的配置与容器的运行解耦。
  • 当你希望将数据保存到远程主机或云上。
  • 你希望在不同的宿主机直接备份/恢复/迁移数据时,volume是一个很好的选择。你可以停止运行使用volume的容器,然后直接备份volume所在的目录即可,如/var/lib/docker/volumes/

1.2 bind mounts

Bind mounts:

  • 与volume相比,它的功能比较局限。当使用bind mounts时,宿主机的目录或文件被挂载到容器中。容器将按照挂载目录或文件的绝对路径来使用或修改宿主机的数据。宿主机中的目录或文件不需要预先存在,在需要的使用会自动创建。使用bind mounts在性能上是非常好的,但这依赖于宿主机有一个目录妥善结构化的文件系统。(使用bind mounts的容器可以在通过容器内部的进程对主机文件系统进行修改,包括创建,修改和删除重要的系统文件和目录,这个功能虽然很强大,但显然也会造成安全方面的影响,包括影响到宿主机上Docker以外的进程)

适用场景:

  • 将宿主机的系统配置文件共享给容器,这是Docker为容器提供DNS配置的默认方式,即通过bind mounts的方式将宿主的的/etc/resolv.conf文件挂载到容器中。
  • 将宿主机开发环境中的源代码或实验结果共享给容器。例如:你在宿主机上进行一个项目Maven的测试,每次你在宿主机上对Maven项目进行了更改后,容器就可以直接获取更改后的结果
  • 你可以确定宿主机的文件系统结构应该与容器内部完全一致时。

1.3 tmpfs mounts

tmpfs:

  • 在这种挂载方式下,容器内的应用数据将不会被持久的保存在硬盘上。其中的数据只能在某个容器的生存周期内被使用,或者用于保存一些不需要持久存储或者一些敏感的数据信息。

适用场景:

当你出于安全原因,或者容器性能优化的原因(如需要写入大量的不持久的状态数据时),不需要容器的数据长久保存时可以使用这种方式。

深入浅出容器学习--Docker数据卷的更多相关文章

  1. Docker学习笔记 - Docker数据卷的备份和还原

    学习目标: 备份数据卷 还原数据卷 # 通过容器备份数据卷容器中的数据卷 docker run --volumes-from dvt5 -v ~/backup:/backup --name dvt10 ...

  2. docker数据卷学习-利用数据卷实现mysql的快速恢复和迁移

    docker数据卷学习 一 新建带有数据卷的容器 1.从docker hub下载centos7镜像 # docker pull centos 2. 创建container # docker run - ...

  3. Docker学习第三天(Docker数据卷管理)

    1.Docker数据卷管理 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供了三种 ...

  4. Docker 数据卷容器

    如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的. 首先,创建一个命名的数据卷容器 dbdata: $ sud ...

  5. docker 数据卷和docker数据卷容器以及数据卷的备份和还原

    一:数据卷 1.什么是数据卷 数据卷是通过特殊设计的目录,可以绕过联合文件系统,为一个或者多个容器提供服务,数据卷是在docker宿主机当中,数据卷可以是文件也可以是文件夹. 2.特点 1.数据卷在容 ...

  6. 聊聊Docker数据卷和数据卷容器

    当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...

  7. Docker 数据卷和数据卷容器

    1.本节课主要讲解如何在Docker内部及容器之间管理数据.容器中管理数据主要有两种方式:数据卷(Data volumes)数据卷容器(Data volume containers) 2.数据卷:是一 ...

  8. 实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作

    Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3 ...

  9. Docker容器数据管理(数据卷&数据卷容器)

    一:前言 在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案: 1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境 ...

  10. Docker 数据卷与容器互联

    Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

随机推荐

  1. go minio 设置访问权限

    bucket 权限 桶默认可以有三种 Access Policy 策略:public.custom.private. public:不经过任何认证可以直接访问资源 custom:自定义策略 Acces ...

  2. PostgreSQL psql 常用快捷命令

    psql 常用快捷命令 \l 显示所有数据库 \c 切换当前数据库,相当于 mysql 的 use 命令 \d 显示数据库中有哪些表 \d tb_name 显示表 tb_name 的定义 \d+ 显示 ...

  3. go strings包

    //是否包含指定的字符串中任意一个字符 有一个出现过 就返回true fmt.Println(strings.ContainsAny(s1,"glass")) //返回指定字符出现 ...

  4. 元模型:开启AI哲学思考的数字奇点

    为推广动态模型让AI写的.动态模型和AI非常契合,元模型对AI有意义,所以让AI写更好.元模型其实是非常简单的一个模型,使用XML表示代码如下. <thing name="thing& ...

  5. 我要成为node_modules大师!(一):包管理器选择,依赖关系分析

    好家伙 1.npm曾经的一些问题 1. 依赖地狱(Dependency Hell) 嵌套依赖结构:早期版本的 npm 采用嵌套的 node_modules 结构,依赖层级极深,容易导致路径过长问题(尤 ...

  6. zk源码—5.请求的处理过程

    大纲 1.服务器的请求处理链 (1)Leader服务器的请求处理链 一.PrepRequestProcessor请求预处理器 二.ProposalRequestProcessor事务投票处理器 三.S ...

  7. macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库

    你好,我是 Kagol,个人公众号:前端开源星球(欢迎关注我,分享更多前端开源知识). TinyPro 后台管理系统的 NestJS 后端依赖 MySQL 和 Redis 数据库,本文主要带大家安装和 ...

  8. SSL证书免费申请(阿里云)

    简介 本文介绍SSL证书免费申请流程 注意: 免费单域名证书,可用于测试.个人试用等场景,org.jp等特殊域名存在无法申请的情况,正式环境建议使用付费证书. 每个实名主体个人/企业,一个自然年内可以 ...

  9. eolinker流程用例步骤之脚本代码[Javascript]:读取多组数据,循环执行同一操作

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景(一)描述: 在未知有多少会员卡的前提下,对会员卡进 ...

  10. element ui select组件 实现鼠标悬浮 自动展开选项

    利用鼠标悬浮事件: 同样的原理也可以设置鼠标移开自动关闭