Docker 核心技术之数据管理
Docker 数据卷简介
为什么用数据卷
- 宿主机无法直接访问容器中的文件
- 容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
- 容器之间也无法直接访问互相的文件
为解决这些问题,docker加入了数据卷(volumes)机制,能很好解决上面问题,以实现:
- 容器与主机之间、容器与容器之间共享文件
- 容器中数据的持久化
- 将容器中的数据备份、迁移、恢复等
数据卷的特点
- 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
- 数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
- 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
- 容器对数据卷的修改是实时进行的。
- 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
Docker 数据卷管理
Docker挂载容器数据卷的三种方式
- bind mounts:将宿主机上的一个文件或目录被挂载到容器上。
- volumes:由Docker创建和管理。使用docker volume命令管理
- tmpfs mounts:tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上。

bind mounts方式挂载数据卷
利用 docker run/create的参数为容器挂载数据卷
方式一: -v, --volume参数
- -v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
方式二:--mount参数
- --mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路径
注意:src指定的文件和路径必须提前创建或存在
方式一:命令演示
把宿主机上 root 目录下的 volume_dir 绑定到 到容器的c_dir下 (使用 -v 挂载 宿主机上的文件/文件夹不存在的话会自动创建)
docker run -dti -v /root/volume_dir:/root/c_dir centos

在容器内创建一个文件
docker exec ab2 touch /root/c_dir/text.txt
这时在宿主机的 volume_dir 目录下可以查看

方式二:命令演示
把宿主机上 root 目录下的 mount_dir 绑定到 到容器的c_dir2下 (使用 -mount 挂载 宿主机上的文件/文件夹不存在的话会报错)
docker run -dti --mount type=bind,src=/root/mount_dir,dst=/root/c_dir2 centos docker exec 5f7c touch /root/c_dir2/text.txt ls

volumes方式挂载数据卷
利用docker run/create为容器挂载数据卷
方式一: -v, --volume参数
- -v VOLUME-NAME:容器中的文件或者文件夹路径
方式二:--mount 参数
- --mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
volume对象管理:
- docker volume 命令管理volume数据卷对象
- docker volume create 创建数据卷对象
- docker volume inspect 查看数据卷详细信息
- docker volume ls 查看已创建的数据卷对象
- docker volume prune 删除未被使用的数据卷对象
- docker volume rm 删除一个或多个数据卷对象
查看 docker 中所有的数据卷
docker volume ls

方式一:命令演示 (指定了一个docker 中不存在的数据卷,会自动的创建)
docker run -dti -v volume_test:/root/c_dir centos docker volume ls

方式二:命令演示(指定了一个docker 中不存在的数据卷,会自动的创建)
docker run -dti --mount type=volume,src=volume-test2,dst=/root/c_dir centos

tmpfs mount方式挂载数据卷
利用docker run/create为容器挂载数据卷
- --mount type=tmpfs, dst=PATH
命令演示
docker run -dti --mount type=tmpfs,dst=/root/c_dir centos docker volume ls

共享其他容器的数据卷-数据卷容器
利用docker run/create 的--volumes-from参数指定数据卷容器
- docker run/create --volumes-from CONTAINER
docker run -dti --mount type=volume,src=volume,dst=/root/c_dir centos docker run -dti --volumes-from 5fe centos docker volume ls docker volume inspect volume cd /var/lib/docker/volumes/volume/_data # 在两个容器中创建文件 docker exec 5fe touch /root/c_dir/text.txt docker exec 5fee24 touch /root/c_dir/new_text.txt ls
可以发现他们是共用一个数据卷的

Docker 数据卷注意事项
Docker的数据卷更多会是使用volumes方式来进行使用。使用时需注意:
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
- 如果挂载一个非空的数据卷到容器中的一个目录中(这个目录为空),那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉(隐藏掉数据卷中的原始数据,只显示容器本身的数据)。
- 这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
重点掌握
- 数据卷特征和简介
- mount方式绑定数据卷
- 数据卷挂载的三种形式
- 数据卷使用的注意事项
Docker 核心技术之数据管理的更多相关文章
- Docker容器的数据管理
Docker容器的数据管理 Docker容器的数据管理 什么是数据卷(Data Volume)? 数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问 数据卷设计的目 ...
- Docker 核心技术与实现原理
提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...
- Docker核心技术
Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...
- Docker学习(14) Docker容器的数据管理
Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原
- 深入浅出Docker(一):Docker核心技术预览
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...
- Docker入门之五数据管理
在Docker使用过程中,需要对数据进行持久化或需要在多个容器之间进行数据共享,就会涉及容器的数据管理操作.主要有两种方式:1.数据卷 2.数据卷容器. 一.数据卷 数据卷是一个可供容器使用的特殊目录 ...
- 后端技术杂谈10:Docker 核心技术与实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- docker核心技术(2)
鸟瞰容器生态系统 一谈到容器,大家都会想到 Docker. Docker 现在几乎是容器的代名词.确实,是 Docker 将容器技术发扬光大.同时,大家也需要知道围绕 Docker 还有一个生态系统. ...
- 【转】Docker 核心技术与实现原理
转自:https://draveness.me/docker 提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段 ...
随机推荐
- Jenkins~配合Docker及dotnetCore进行生产和测试环境的灵活部署
回到目录 首先要清楚本文是讲dotnetcore项目在生产和测试环境部署的,这在过去的frameworks项目里,我们可以通过设置web.config的环境变量,然后再发布时指定具体的变量,去实现生产 ...
- 强化学习(六)时序差分在线控制算法SARSA
在强化学习(五)用时序差分法(TD)求解中,我们讨论了用时序差分来求解强化学习预测问题的方法,但是对控制算法的求解过程没有深入,本文我们就对时序差分的在线控制算法SARSA做详细的讨论. SARSA这 ...
- c#多线程总结(纯干货)
线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...
- SiftGPU在Ubuntu和Windows下的编译与使用
Sift特征应该是使用最多的局部特征了,但是相比其他的一些特征描述符,计算sift特征描述符的时间较长.Changchang Wu使用GPU加速,实现了GPU版的sift特征提取SiftGPU. Si ...
- Django-restframework 之频率源码分析
Django-restframework 之频率源码分析 一 前言 经过权限判断之后就是进行频率的判断了,而频率的判断和权限又不一样,认证.权限和频率的执行流程都差不多,使用配置里面的相关类来进行判断 ...
- PHP 二维数组排序保持键名不变
对二维数组指定的键名排序,首先大家想到的是array_multisort函数,关于array_multisort的用法我之前也写了一篇废话不多言,我们看个实例: <?php $data = ar ...
- Spring-注解实现IOC
一.定义 注解:是一种标记式的配置方式,与XML配置文件不同,注解提供了更大的便捷性,易于维护修改,但是耦合度高. 本质:是一个继承了 Annotation 接口的接口,注解本身并没有什么作用,通过特 ...
- PHP一些常用的正则表达式分享给大家
一.校验数字的表达式 1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0- ...
- dbutils工具类使用
1DBUtils工具类 1.1概述 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码 DBUtils三个核心功 ...
- Uncaught ReferenceError: jQuery is not defined
页面调试时,明明引入了JQ文件,却一直提示Uncaught ReferenceError: jQuery is not defined错误. 转自:http://blog.csdn.net/baicp ...