镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

(1).卷(volumes):是宿主机器的文件系统的一部分,由Docker进行管理(在Linux,存储于/var/lib/docker/volumes/)。非Docker程序不应该去修改这些文件。Docker推荐使用卷进行持久化数据。卷可支持卷驱动(volume drivers),该驱动允许用户将数据存储到远程主机或云服务商(cloud provider)或其它。没有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷没有明确的名字,当被初始化时,会被赋予一个随机名字。

卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:A.卷可以在容器之间共享和重用;B.对卷的修改会立马生效;C.对卷的更新,不会影响镜像;D.卷默认会一直存在,即使容器被删除。

卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会复制到卷中(仅卷为空时会复制)。卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的卷。

(2).挂载宿主目录(bind mounts, 绑定挂载):通过将宿主机器的路径挂载到容器里的这种方式,从而数据持久化,因此绑定挂载可将数据存储在宿主机器的文件系统的任何地方。非Docker程序可修改这些文件。绑定挂载是Docker早期就存在的,相比起卷,绑定挂载十分简单明了。在开发Docker应用时,应使用命名卷(named volume)代替绑定挂载,因为用户不能对绑定挂载进行Docker CLI(command line interface, 命令行界面)命令操作。

绑定挂载常用于:A.同步配置文件,如:将宿主主机的DNS配置文件(/etc/resolv.conf)同步至容器中;B.在开发程序时,将源代码或Artifact同步至容器中。这种用法与Vagrant类似。

卷相关操作命令如下:

docker volume create vol1 # 创建一个卷,如卷名为vol1
docker volume ls # 查看所有的卷
docker volume inspect vol1 # 查看指定卷的信息,如卷vol1
# 启动一个挂载卷的容器,如将卷名为"vol1"挂载到容器的/home/fengbingchun目录;新建的容器名为"yyyy"; -P,随机端口映射,容器内部端口随机映射到主机的端口
docker run -it -P --name yyyy --mount source=vol1,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash
docker inspect yyyy # 查看容器中卷的具体信息,卷的信息在"Mounts"字段内,"yyyy"为容器名
docker volume rm vol1 # 删除卷,如卷名为"vol1",需要卷"vol1"没有被任何容器使用时才能删除
docker volume prune # 删除所有没有被使用的卷

挂载主机目录相关操作命令如下:

# 挂载一个本地主机的目录到容器中去,新建的容器名为"test"; -P,随机端口映射,容器内部端口随机映射到主机的端口;
# "/home/GitHub"为本地主机目录,本地目录的路径必须是绝对路径;"/home/fengbingchun"为挂载到容器此目录;Docker挂载主机目录的默认权限是读写
docker run -it -P --name test --mount type=bind,source=/home/GitHub,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash # linux
docker run -it -P --name test --mount type=bind,source=e:\GitCode,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash # windows
docker inspect yyyy # 查看容器中挂载主机目录的具体信息,挂载主机目录的配置信息在"Mounts"字段内,"yyyy"为容器名

Docker容器中数据两种持久化存储方式:卷和挂载宿主目录相关推荐

  1. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?

    *** 一.创建线程 1.继承Thread类 定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中 创建该类对象, 调用start()方法就可以开启一条新线程, 新 ...

  2. Redis详解之-事件订阅和持久化存储方式(RDB和AOF)(二)

    转载:https://blog.csdn.net/u010963948/article/details/78881057 对以前的内容进行一下总结和复习. 了解Redis的基本参数配置和使用. 了解事 ...

  3. Redis中两种持久化机制RDB和AOF

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  4. Redis 中两种持久化机制详解

    Redis 持久化机制(快照.AOF) 快照 (Snapshot) 1. 客户端方式之 BGSAVE(多线程执行) 2. 客户端方式之 SAVE(单线程执行) 3. 服务器配置方式之 配置快照触发条件 ...

  5. Linux中的Docker容器的数据卷

    一.数据卷的概念 1.数据卷是宿主机中的一个目录或者文件 2.当容器目录和数据卷目录绑定后,对方的修改会立即同步 3.一个数据卷可以被多个容器同时挂载 4.一个容器也可以挂载多个数据卷 二.数据卷的作 ...

  6. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  7. 如何在Docker容器中运行Docker [3种方法]

    在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法. Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其 ...

  8. C语言学习笔记-----scanf【通过键盘将数据输入到变量中】(两种用法)

    C语言学习笔记-----scanf[通过键盘将数据输入到变量中](两种用法) 用法一:scanf("输入控制符",输入参数): 功能: 将从键盘输入的字符转化为输入控制符所规定格式 ...

  9. docker 容器共享数据_如何在Docker容器之间共享数据

    docker 容器共享数据 介绍 (Introduction) Docker is a popular containerization tool used to provide software a ...

最新文章

  1. Tor 出口节点将运行在图书馆的电脑上
  2. 一个不错的权限管理模块设计案例
  3. 搜索引擎是如何判断网站质量的?
  4. CCNA-(9)-思科交换机特点
  5. mysql+enable+sql+log_CentOS7下利用rsyslog+loganalyzer配置日志服务器及Linux和windows客户端配置...
  6. VTK:几何对象之OpenVRCube
  7. Git强制覆盖还原本地救火命令
  8. nodejs里socket.on和socket.once的单步调试
  9. 66 http的无状态协议和cookie概述
  10. linux路由器实际配置案例
  11. matlab表格三维柱状图,excel制作四维数据表格-excel三维柱形图 ,请问如何根据excel表格中的数据......
  12. 推荐:年度巨献:《Ubuntu桌面生存指南》(作者:ghosert)
  13. win10更新后C盘空间变小解决方法
  14. (java毕业设计)基于java汽车租赁管理系统源码
  15. 计算机科学 期刊 模板,计算机学报投稿模板.doc
  16. 关于固态硬盘SSD的4K对齐
  17. SpringSecurity---细粒度的权限控制
  18. 队列的应用--火车车厢重排列
  19. Android 中关与类转换异常的问题。
  20. 4g网络什么时候淘汰_4G网络即将被淘汰?4G手机:我还没过时

热门文章

  1. Open3D DbScanClustering聚类算法
  2. Python、Matplot的subplot实现一行3列的子图绘制,并添加背景色
  3. 机器学习(2)特征提取1 -- 字典特征提取
  4. java string改变的影响_为什么Java的string类要设成immutable(不可变的)
  5. opencv中image watch插件安装与使用教程
  6. 电话号码正则表达式键盘弹起验证
  7. 在Ubuntu 14.04.3 64bit上安装照片编辑软件Fotoxx 15.10
  8. Linux 下获取本机所有网卡 以及 网卡对应ip 列表
  9. 设计模式 之美 -- 原型模式
  10. MQTT Qos类型解释