目录

一.数据卷概述

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意: 数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

二.创建数据卷

使用命令docker volume create创建数据卷,如:

$ docker volume create test-vol
test-vol

三.查看数据卷

使用命令docker volume ls查看所有的数据卷,如:

$ docker volume ls
DRIVER VOLUME NAME
local my-vol

在主机里使用命令docker volume inspect可以查看指定数据卷的详细信息,如:

$ docker volume inspect test-vol
[
{
"CreatedAt": "2018-05-03T16:42:05+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]

使用的docker volume create test-vol创建的数据卷默认挂载目录为“/var/lib/docker/volumes/test-vol/_data”。

注意: 数据卷的默认主机目录是:/var/lib/docker/volumes,但是在Mac下使用Docker Desktop时是不存在目录“/var/lib/docker/volumes”的,因为Mac上启动Docker本质上是启动了一个虚拟机,所以并不会在Mac主机本身存在数据卷的默认挂载目录,参考:Mac使用docker时,卷默认挂载路径/var/lib/docker/volumes不存在问题

四.挂载数据卷

所谓"挂载数据卷"是指将数据卷加载到容器的指定目录,在用docker run命令的时候,可以将数据卷挂载到容器里。在一次docker run中可以挂载多个数据卷。挂载数据卷可以使用2个选项:--mount或者--volume,推荐使用--mount

如下创建一个名为web的容器,并加载一个数据卷到容器的/usr/local/tomcat/webapps目录:

$ docker run -d -P --name web --mount source=my-vol,target=/usr/local/tomcat/webapps tomcat

挂在数据卷之后,来看一下如下信息:

$ docker volume inspect my-vol
[
{
"CreatedAt": "2018-05-03T17:02:43+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
$ sudo ls /var/lib/docker/volumes/my-vol/_data -al
total 28
drwxr-x--- 7 root root 4096 May 3 17:02 .
drwxr-xr-x 3 root root 4096 May 3 16:34 ..
drwxr-x--- 14 root root 4096 May 3 16:58 docs
drwxr-x--- 6 root root 4096 May 3 16:58 examples
drwxr-x--- 5 root root 4096 May 3 16:58 host-manager
drwxr-x--- 5 root root 4096 May 3 16:58 manager
drwxr-x--- 3 root root 4096 May 3 17:04 ROOT

将数据卷加载到容器的指定目录之后,在数据卷的挂载点目录下就可以看到容器的对应目录下的内容。而且,此时对数据卷挂载目录下内容的修改会同步到容器的对应目录下。

显然,上面看到的数据卷中的信息正是容器的/usr/local/tomcat/webapps目录下的内容。

现在来修改/var/lib/docker/volumes/my-vol/_data/ROOT/index.jsp文件,可以看到修改的内容马上就生效。

现在停止容器,查看/var/lib/docker/volumes/my-vol/_data内容发现数据依然存在,删除容器之后再查看,数据依然存在。

五.删除数据卷

可以使用命令docker volume rm删除数据卷,如:

$ docker volume rm my-vol
my-vol

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。

如果需要在删除容器的同时移除对数据卷的引用,可以在删除容器的时候使用"-v"选项,即:docker rm -v

注意: 在删除容器时使用"-v"选项并不会删除该容器使用的数据卷,仅仅是删除容器对数据卷的引用关系;因为容器删除之后,如果未使用"-v"选项移除对应的数据卷,那么再去删除数据卷时将会提示数据卷正在容器中被使用,不允许删除。

无主的数据卷可能会占据很多空间,需要使用命令docker volume prune进行清理:

$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
my-vol
test-vol Total reclaimed space: 4.642MB

六.挂载主机目录或文件

1.挂载一个主机目录作为数据卷

使用--mount选项可以指定一个本地主机的目录挂载到容器中去,此时需要指定type=bind,如:

$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps tomcat

此时在主机目录上做的修改,在容器中就能够及时地被感知到.

Docker挂载主机目录的默认权限是读写,也可以通过增加readonly指定为只读,如:

$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly tomcat

2.挂载一个主机文件作为数据卷

--mount选项也可以从主机挂载单个文件到容器中,如:

$ docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:16.04 bash

这样就可以记录在容器输入过的命令了。

七.挂载数据卷与主机目录/文件的比较

相同点:

  1. 挂载数据卷或者主机目录/文件都是容器进行数据管理的方式
  2. 都可以通过"--mount"选项进行挂载

不同点:

  1. 挂载数据卷时不需要明确指定type参数,只需要指定source和target即可,例如:--mount source=my-vol,target=/usr/local/tomcat/webapps
  2. 挂载主机目录/文件时必须明确指定type参数为bind,例如:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps;另外,挂载的主机目录默认权限是读写,也可以通过增加readonly指定为只读:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly

【参考】

https://blog.csdn.net/zhangthree1/article/details/107542739 docker卷和目录的区别

https://yeasy.gitbook.io/docker_practice/data_management/volume 数据卷

Docker实践之07-数据管理的更多相关文章

  1. docker 实践四:数据管理

    这篇是关于 docker 的数据管理. 注:环境为 CentOS7,docker 19.03. 一般容器中管理数据主要有两种方式: 数据卷(Data Volumes):容器内数据直接映射到本地主机环境 ...

  2. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  3. docker实践之docker-compose部署mysql

    文章目录 docker实践之docker-compose部署mysql 1.安装部署docker 2.编写docker-compose文件 3.编写配置文件和初始化文件 4.启动数据库 5.检查初始化 ...

  4. 【容器云】传统金融企业的 Docker 实践

    基于 Docker 的容器云-Padis 目前市面上基于容器云的产品有很多,对于平安而言,则是基于 Docker 的 Padis 平台.所谓 Padis,全称是 PingAn Distribution ...

  5. CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  6. 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享

    架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是 CI/CD.Dev ...

  7. docker 实践(一)

    docker 简介 容器虚拟化,比传统的虚拟化轻量 2013年出现,发展非常迅猛 Redhat在6.5版本开始支持docker 使用go语言开发,基于apache2.0协议 开源软件,项目代码在git ...

  8. Docker实践之02-使用镜像及定制

    目录 一.获取镜像 二.使用镜像启动容器实例 三.列出镜像 四.删除本地镜像 五.定制镜像 通过commit命令定制镜像 通过Dockerfile定制镜像 docker build的工作原理 dock ...

  9. Docker实践之01-入门介绍

    目录 一.Docker概述 镜像 容器 仓库 二.安装Docker 1.在CentOS上安装Docker 2.在Ubuntu上安装Docker 3.启动docker 4.建立Docker用户组 5.测 ...

  10. ASP.NET CORE做的网站运行在docker实践

    用VS2017 建立了 DotNet Core 2.2 的网站后,如何转移到 Docker 下运行? 下面分两种方式来实践: 1.直接手动命今行,将本机目录映射进Docker,运行网站.2.制作 Im ...

随机推荐

  1. [转帖]12.24.2 DECIMAL Data Type Characteristics

    https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html This section discusses the characteri ...

  2. [转帖]CTF -bugku-misc(持续更新直到全部刷完)

    CTF -bugku-misc(持续更新直到全部刷完) https://www.cnblogs.com/cat47/p/11432475.html 1.签到题 点开可见.(这题就不浪费键盘了) CTF ...

  3. [转帖]Jmeter常用配置元件(二):“HTTP Cookie管理器”登录状态保持

    在API接口测试过程中,我们需要传递cookie值作为连接状态的保持,例如登录后状态信息.通过使用Jmeter提供的"HTTP Cookie管理器"来实现. 一般情况下不需要输入什 ...

  4. [转帖]解决jmeter请求响应结果乱码的问题

    如下图所示,请求百度接口的时候,发现返回的信息里面中文是乱码 这个时候我们只需要改一下jmeter里的配置文件,设置响应结果的字符编码为UTF-8就行了. 进入jmeter安装目录/bin中,找到jm ...

  5. [转帖]Linux-find命令报错: missing argument to `-exec'

    https://www.cnblogs.com/yeyuzhuanjia/p/17427143.html 报错提示:find: missing argument to `-exec' 今天写一个清理脚 ...

  6. 【转帖】26.Java本地方法的理解(native方法)

    目录 1.什么是本地方法? 2. 为什么要使用Native method? 1.什么是本地方法? 本地方法就是java代码里面写的native方法,它没有方法体.是为了调用C/C++代码而写的.在JN ...

  7. [转帖]vm内核参数之缓存回收drop_caches

    注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 1.关于drop_caches 通常在内存不足时,我们习惯通过echo 3 > /proc/sys/vm/drop_ ...

  8. [转帖]linux 系统级性能分析工具 perf 的介绍与使用

    目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...

  9. Oracle12c 快速启动命令设置

    Oracle12c 安装完成之后 一般不会自动启动需要进行一下简单的设置才可以. 方法也比较简单. 可以使用 oracle 自带的 dbstart的命令执行服务启动 需要注意的事项是: 第一修改一个参 ...

  10. 任意文件下载包含https的图片

    使用a标签进行下载 <a href="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ. ...