Volume 是 docker 容器生成持久化数据的首选机制。bind mounts 依赖主机机器的目录机构,volume 完全由 docker 管理。volume 较 bind mounts 有几个优势:
1. volume 比 bind mounts 更易备份和迁移。
2. 可以使用 docker cli 命令和 API 管理 volume。
3. volume 工作在 linux 和 windows 容器上。
4. volume 在多个容器间共享可以更安全。
5. volume 驱动允许存储 volume 到主机和云,加密 volume 内容,或者添加其它功能。
6. 新的 volume 可以含有容器预放置的内容。
另外,volume 通常与持久化数据到容器的可写层相比是更好的选择,因为 volume 不增大容器的大小,并且 volume 的内容在容器的生命周期之外存在。
如果容器产生不持久化的状态数据,考虑使用 tmpfs mount 来避免永久存储,并且通过避免写入容器的可写层来增加容器性能。
选择 -v 还是 --mount
最初,-v 或 --volume 用于独立的容器,--mount 用于 swarm 服务。
而自 Docker 17.06 开始,你可以将 --mount 用于独立的容器。一般而言,--mount 更明确和冗长。
最大的不同是,-v 语法把所有的选项绑定到一行,而 --mount 语法把它们分开。
如果需要指定 volume 驱动选项,你必须使用 --mount。
-v 或 --volume: 包含三个字段,由冒号分割。字段必须保持正确顺序,每个字段的含义不是很明显。
1. 在有名字的 volume 中,第一个字段是 volume 的名字,在主机上唯一。对于匿名的 volume,第一个字段可以省略。
2. 第二个字段是文件或目录挂载到容器中的路径。
3. 第三个字段是可选的,是逗号分隔的选项列表,比如 ro 。
--mount : 包含多个键值对,由逗号隔开,每一个是 <key>=<value>对。--mount 语法比 -v 或 --volume 更冗余,但键的顺序并不重要,value 更容易理解。
1. 挂载的 type 可以是 bind, volume, tmpfs。本节讨论 volume,所以类型总是 volume。
2. 挂载的 source。对于有名字的 volume,它是 volume 的名字,对于匿名的 volume,这个字段可以省略,可以指定为 source 或 src。
3. destination 的值表示文件或目录 挂载到容器中的路径。可以指定为 destination,dst,target。
4. reanonly 选项,如果存在,导致作为只读挂载到容器中。
5. volume-opt 选项,可以指定不止一次,有一个含选项名和值的键值对。
-v 和 --mount 的行为差异
相对 bind mounts,所有 volume 的选项对 --mount 和 -v 都可用。
当与 service 一起使用 volume 时,只有 --mount 是支持的。
创建和管理 volume
不像 bind mount, 你可以在容器外面创建和管理 volume。
$ docker volume create myvol
$ docker volume ls
$ docker inspect myvol
$ docker volume rm myvol
带着 volume 启动 container
如果启动容器时带的容器不存在,那么 docker 会创建一个。
# -v 将主机 /var/lib/docker/volumes/volume_os 挂在到容器中 /var/lib/docker/volume_os,以下两条等同。
docker run --rm -it -v volume_os:/var/lib/docker/volume_os 5e8b97a2a082
docker run --rm -it --mount 'type=volume,src=volume_os,dst=/var/lib/docker/volume_os,volume-driver=local' 5e8b97a2a082
带着 volume 启动 service
当你启动一个 service 并且定义了一个 volume,每一个 service 容器使用它自己的本地 volume。
如果你使用 volume 的 local 驱动,没有一个容器可以共享它的数据。
示例启动四个复制的 nginx 服务,每一个使用本地 volume 叫 myvol2。
$ docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
验证服务正在运行:docker service ps devtest-service
移除服务:docker service rm devtest-service,移除 service 不会移除任何 service 创建的 volume。volume 移除是独立的步骤。
docker service create 命令不支持 -v 或 --volume 标记,必须使用 --mount 标记。
使用容器放置 volume
如果启动一个容器,容器中被挂载的目录有文件或目录,那么目录的内容会被拷贝到 volume 中。
$ docker run -d --name=nginxtest -v nginx-vol:/usr/share/nginx/html nginx:latest
使用只读 volume
$ docker run -d --name=nginxtest -v nginx-vol:/usr/share/nginx/html:ro nginx:latest
在机器间共享数据
当构建容错性应用时,你可能需要配置多个复制的相同服务来访问相同的文件。
当开发应用时,有多种方式可以取得。第一种是应用把文件存到云对象系统中,比如 Amazon S3,另一种是创建一个支持把文件写到外部存储系统(如NFS)的 volume 驱动。
volume 驱动允许你从应用层抽象底层存储系统。例如,如果 service 使用一个 NFS 驱动的 volume,你可以更新 service 使用不同的驱动,比如把数据存储到云中,而不需要改变应用逻辑。
使用一个 volume 驱动
初始化安装
$ docker plugin install --grant-all-permissions vieux/sshfs
使用一个 volume 驱动创建 volume
$ docker volume create --driver vieux/sshfs \
-o sshcmd=test@node2:/home/test \
-o password=pwd sshvolume \
sshvolume
启动容器时创建使用 volume 驱动的 volume
$ docker run -d \
--name sshfs-container \
--volume-driver vieux/sshfs \
--mount src=sshvolume,target=/app, volume-opt=sshcmd=test@node2:/home/test, volume-opt=password=pwd \
nginx:latest
备份,恢复,迁移 data volume
volume 对备份,恢复,迁移 有用。使用 --volumes-from 标记来创建一个新的容器挂载到 volume.
备份一个容器
# 启动新容器,从 dbstore 容器中挂载 volume,挂载一个本地目录叫 backup,传递一个命令压缩 dbdata volume 的内容到 /backup 目录的 backup.tar
docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
从备份中恢复容器
# 创建一个容器 dbstore2:
docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
# 解压缩备份文件到新容器的数据 volume 中:
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bach -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
你可以使用以上技术来自动备份、迁移、恢复来测试。
移除 volume
docker 数据 volume 在容器被删除后依旧存在。有两种类型的 volume。
1. 有名字的 volume:有一个指定的容器外的来源。
2. 匿名的 volume:没有指定来源,所以当容器被删除时会指示 docker 守护进程引擎移除它们。
移除匿名 volume
要自动移除匿名容器使用 --rm 选项。例子中,命令创建一个匿名 volume /foo 。当容器移除时,docker 引擎移除 /foo volume,但不会移除 awesome volume
$ docker run --rm -v /foo -v awesome:/bar busybox top
移除所有未使用的 volume
$ docker volume prune
Guide:https://docs.docker.com/storage/volumes/
Link:https://www.cnblogs.com/farwish/p/9260613.html
- Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。
Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原. 数据卷就是数据(一个文件或者文件夹). Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周 ...
- docker容器持久化卷讲解
docker容器自身存储数据效率比较低,因此我们为了提高磁盘IO的性能等,需要在容器中挂载一个外部存储设备.关于讲解大致如下: Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中 ...
- Docker容器和数据可视化管理工具Flocker
Flocker 可轻松实现 Docker 容器及其数据的管理.这是一个数据卷管理器和多主机的 Docker 集群管理工具,你可以通过它来控制数据.可用来在 Docker 中运行你的数据库.查询和 K/ ...
- docker容器备份、恢复和迁移volume方案
volume作为数据的载体,在很多情况下需要对其中的数据进行备份.迁移或是恢复.下面一docker容器的volume为例,说一下备份的技巧. 我们先建立一个容器vol_simple,该容器在/date ...
- Docker 容器的数据卷
数据卷的特点: 1. 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中 2. 数据卷可以在容器之间共享和重用 3. 可以对数据卷里的内容直接进行修改 ...
- Docker容器的数据卷
一.数据卷概念 1.数据卷是宿主机中的一个目录或文件 2.当容器目录和数据卷目录绑定后,对方的修改会立即同步 3.一个数据卷可以被多个容器同时挂载 4.一个容器也可以挂载多个数据卷 简单理解:有点类似 ...
- 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据
基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据 by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 3 使用前提 3 使用方法 ...
- 为你的docker容器增加一个健康检查机制
1.健康检查 在分布式系统中,经常需要利用健康检查机制来检查服务的可用性,防止其他服务调用时出现异常.自 1.12 版本之后,Docker 引入了原生的健康检查实现. 如何给Docke配置原生健康检查 ...
- Docker容器学习梳理 - Volume数据卷使用
之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...
随机推荐
- springboot2.0 springcloud 断路器仪表盘支持
springboot 1.5 的时候 springcloud 添加 断路器仪表盘 按照网上的方法是没有问题的 但是 springboot2.0的时候一直无法连接 所以需要添加 @Beanpubl ...
- Reac全家桶笔记
函数作为无状态组件的使用: const EllipsisTdContent = ({ text, width }) => { return ( <div className="t ...
- .Net Core 没有 WebForm 是 历史 的 退步, MVC 是一个 糟糕 的 设计
WebForm 自面世以来, 广受广大开发人员的欢迎 . 当然, WebForm 有一些 著名的 弊病, 比如 笨重的 ViewState . 不过 我们 可以 用 一些 更加 先进 和 灵巧 的 ...
- Wavelet Ridgelet Curvelet Contourlet Ripplet
Ripplet: A New Transform for Image Processing Jun Xu, Lei Yang and Dapeng Wu Ripplet: A New Transfor ...
- python基础知识6---文件处理
阅读目录 一 文件操作 二 打开文件的模式 三 操作文件的方法 四 文件内光标移动 五 文件的修改 一 文件操作 一 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用pytho ...
- 自定义页面微信、微博、QQ分享效果
几行简单的分享代码既可以实现,先看下效果: 第一步:页面因为结构代码 <div id="freebtn"> <ul> <li class=" ...
- excle删除重复项的行,自定义删除第几个
在B1输入 =COUNTIF(A$1:A1,A1) 下拉,会有数字1.2.1.2 第二步,选中B列升序排序,排序后,将B列为1的整行删除即可. 再补充下,这样是以姓名为条件来筛选,不会影响你的数据.你 ...
- 表单数据转javabean对象
- 1、Netty 实战入门详解
一.Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程 ...
- html/css/js----js中遇到的一些问题
学习前端的时候有时也会遇到一些弄不明白的问题,学习js会有更多的方法不清楚它的用法,我谨以在学习中遇到的一些问题记录下来,以便日复习! 一."window.opener.location.r ...