Docker存储卷(V18.X)

简介

介绍

  Docker的存储卷称之为volume,本质上容器上的一个或者多个目录,而这些目录绕过了联合文件系统,与宿主机中的目录或者其他容器目录进行了绑定关系,这种绑定关系可以看作Linux的mount操作,当容器中的程序对这些目录写入数据时,其实写入到的是与之绑定的宿主机目录上,这样就实现了数据的存储功能。特别说明:本文章所使用的docker版本基于v18.X,对于较早版本的docker并不适合,例如tmpfs类型卷是v17.06新加入的存储卷。

作用

  默认情况下,容器不使用任何 volume时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的删除而被删除,而想要持久化的存储这些数据,就得使用存储卷。特别的,保存容器中的数据也可以使用 docker commit 命令将容器提交为一个新的镜像,这个镜像中会保存容器运行时的所有数据(绑定的数据卷除外),但此种方法非常不推荐,因为这样的镜像通常会很大,镜像拉取以及运行容器都会变慢。当容器使用了存储卷,即使容器被删除了,但是与绑定的存储卷还在,对应目录的数据都会保存,如果想要恢复该容器,只要新建的容器绑定该存储卷,对应目录的数据也会随之恢复。

分类

  Docker存储卷可分为两类:

  • Volumes:数据卷,这类存储卷是被Docker Daemon管理,可使用docker volume create显示创建,被创建出来的卷位于/var/lib/docker/volumes/下,使用时候只需指定使用卷的名称以及对应的容器的一个目录,删除时候只需指定删除卷名即可,这类数据卷是存储数据最为推荐的方式。
  • Bind mounts :绑定挂载卷,从早版本docker提供,这类存储卷可以是宿主机的任意目录,也可以是来自其他容器的目录,不受docker Daemon管理,删除时候需要手动清理目录。
  • tmpfs mounts:临时挂载卷,该类存储卷数据存放在主机内存中,好处在于这类存储卷由于使用的tmpfs格式文件系统,读写性能好,但同时也增加了主机的内存开销,Docker早期版本不支持此类存储卷。

以下是其示意图:

存储卷使用

--volume&&--mount

  存储卷的使用是在docker run命令时候使用-v或者--volume来指明使用的存储卷,但是如果需要指明更多选项如卷类型、驱动等那就需要使用--mount来指明更多的选项。以下是两种选择的使用方法。

-v或--volume选项:[volume_name]:container_path:[options]

解释:

由三个字段组成,用冒号字符(:)分隔,字段必须按正确的顺序排列volume_name:卷名,可省略,省略的时候默认会分配一个随机目录,在/var/lib/docker/volumes/随机目录/_data。还可以指定宿主机目录。container_path:绑定的容器中的目录,必须。options:其他选项,是逗号分隔的选项列表,例如读写模式(ro、rw),可省略。

示例:创建一个绑定挂载卷

--mount:该选项从V17.06加入,由多个键值对组成,用逗号分隔,每个键值由=组成。常用的key如下:

  • type:指明卷的类型,三种类型之一bind、volume、tmpfs
  • source:可简写为src,指定挂载来源通常是卷名称,匿名卷时忽略该选项
  • destination:可简写为dst或target,指定容器中的使用的目录
  • readonly:指定卷是否为只读
  • volume-opt:其他挂载选项可以多次使用,采用volume-opt=type=nfs

示例:将上述容器使用--mount启动(这里换一个名称为nginx-c2):

使用建议:两个命令能都实现数据卷的挂载,如果是老用户可以继续使用-v的方式来运行容器,如果是新用户推荐使用--mount,这样的语法比较简介明了,比如人性化的各种选项src、type、dest,但是如果需要使用tmpfs类型的数据卷时候必须使用--mount。

使用Volumes

  volume类型的数据卷是比较推荐方式,它是能被Docker 管理的卷, 使用流程是先创建卷,在使用-v或--mount进行挂载。如果在docker run时候不指定其宿主机目录,则默认也属于volumes类型,也受Docker管理。 

创建卷

[root@app51 ~] data-~] : : : : : ~]

挂载卷并写入数据

[root@app51 ~] / / /data/tmp/index.html /

在宿主机上查看:

创建卷是还可以指定其他,列如指定大小、uid等其他选项,这些选项都是mount命令的选项,卷的管理中会介绍:

[root@app51 ~] test-~] / tmp

上面的挂载命令使用等价--mount:

[root@app51 ~] /

容器内可以使用mount命令可以查看挂载点:

使用bind mounts

  绑定挂载卷使用,无非指定宿主机的具体某个目录,可以使用-v HOST_PATH:CONTAINER_PATH 也可以使用--mount type=bind,src=HOST_PATH,dst=CONTAINER_PATH。

示例:

[root@app51 ~] / Dockerfile a.txt anaconda-ks.cfg dr.sh nat.sh nginx-/

等价于使用--mount:

[root@app51 ~] / Dockerfile a.txt anaconda-ks.cfg dr.sh nat.sh nginx-/

以只读的方式挂载:

[root@app51 ~] / Dockerfile a.txt anaconda-ks.cfg dr.sh nat.sh nginx-/ /data touch: 1.txt: Read-/data

查看卷(新开终端):

[root@app51 ~]

<span style="color: #800000;">"<span style="color: #800000;">Mounts<span style="color: #800000;">"<span style="color: #000000;">: [
{
<span style="color: #800000;">"<span style="color: #800000;">Type<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">bind<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Source<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">/root<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Target<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">/data<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">ReadOnly<span style="color: #800000;">"<span style="color: #000000;">: true
}
],

使用tmpfs mounts

  tmpfs类型的卷只适用于Linux系统,命令行中除了使用--mount指定外还可以使用--tmpfs指定其类型。特别注意的,与volume卷和绑定挂载卷相反,tmpfs挂载是临时的,并且仅在主机内存中持久存在,当容器停止时,将删除tmpfs挂载,并且不会保留写在那里的文件。

示例 使用--mount:

[root@app51 ~] / / tmpfs on /app type tmpfs (rw,nosuid,nodev,noexec,relatime)

等价于使用--tmpfs:

[root@app51 ~] / tmpfs on //

查看挂载卷:

[root@app51 ~]

<span style="color: #800000;">"<span style="color: #800000;">Mounts<span style="color: #800000;">"<span style="color: #000000;">: [
{
<span style="color: #800000;">"<span style="color: #800000;">Type<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">tmpfs<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Source<span style="color: #800000;">": <span style="color: #800000;">""<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Destination<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">/app<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Mode<span style="color: #800000;">": <span style="color: #800000;">""<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">RW<span style="color: #800000;">"<span style="color: #000000;">: true,<span style="color: #800000;">"<span style="color: #800000;">Propagation<span style="color: #800000;">": <span style="color: #800000;">""<span style="color: #000000;">
}
],

注意--mount选项还支持指定挂载目录的大小和权限,选项如下:

 指定一个大小为50m,目录选项为1770类似为tmpfs的存储卷:

[root@app51 ~] / / / / tmpfs on /data/tmp type tmpfs (rw,relatime,size=51200k,mode=1770/ --T 2 root root 40 Mar 1 01:47 tmp

查看其存储卷信息:

[root@app51 ~]

<span style="color: #800000;">"<span style="color: #800000;">Mounts<span style="color: #800000;">"<span style="color: #000000;">: [
{
<span style="color: #800000;">"<span style="color: #800000;">Type<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">tmpfs<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">Destination<span style="color: #800000;">": <span style="color: #800000;">"<span style="color: #800000;">/data/tmp<span style="color: #800000;">"<span style="color: #000000;">,

使用容器数据卷 

  除了以上数据卷外,还可以直接使用容器中已经挂载的数据卷,使用--volumes-from指定,此时两个容器的数据卷是共享的。从本质上来讲,这两数据卷共同挂载了宿主机上的同一个目录。

示例:创建一个容器share-c1挂载当前目录(确保不要退出)

[root@app51 ~] / Dockerfile a.txt anaconda-ks.cfg backup.tar dr.sh nat.sh nginx-/

在运行一个容器挂载share-c1的卷:

[root@app51 ~] / Dockerfile a.txt anaconda-ks.cfg backup.tar dr.sh nat.sh nginx-/

存储卷管理

  docker存储卷管理通过docker volume命令组实现,v18.09的命令集合如下:

1.创建存储卷

docker volume create [OPTIONS] [VOLUME_NAME]

通常这样创建的卷会保存在宿主机目录/var/lib/docker/volumes/VOLUME_NAME/_data如果不指名 VOLUME则会创建匿名卷,方式等同于在docker run -v不指定宿主机目录。

常用选项:

 -o,--opt :指定存储卷挂载选项。常用选项如下:

  • type: 挂载文件系统类型,可以是tmpfs、brtfs、甚至是nfs。
  • device:挂载的设备,
  • o:mount命令挂载选项,其选项可参考

示例一:创建一个普通的卷名称为test-vol-1。

[root@app51 test-vol-1] test-vol-1-vol-1] adm/ crash/ empty/ gopher/ lib/ lock/ mail/ opt/ run/ tmp/ yp// db/ games/ kerberos/ local/ log/ nis/ preserve/ spool/-vol-1] -xr-x 2 root root 6 3月 1 11:08-vol-1]

示例二:创建一个tmpfs类型的存储卷,名称为test-vol-2

[root@app51 test-vol-1] test-vol-2

<span style="color: #008000;">#<span style="color: #008000;">##挂载test-vol-2
[root@app51 test-vol-1]<span style="color: #008000;">#<span style="color: #008000;"> docker run -it --name bs-c10 -v test-vol-2:/data busybox:latest /bin/sh
/ <span style="color: #008000;">#<span style="color: #008000;"> mount |grep /data
tmpfs on /data type tmpfs (rw,size=102400k,uid=1000<span style="color: #000000;">)
/ <span style="color: #008000;">#

示例三:创建一个nfs类型的存储卷,服务器地址为10.1.210.52,权限读写,目录为/data/tmp,名称为test-vol-3

[root@app51 test-vol-1] test-vol-3

需要注意的是:创建的卷即使创建成功了但是挂载的时候很可能出错,docker不会在创建卷时候检查挂载选项是否符合要求。

 2.查看存储卷详情

 docker volume inspect [OPTIONS] VOLUME [VOLUME...]

常用选项:

 -f,--format :输出格式,基于go模版

示例:

[root@app51 ~] : : : :

使用-f:.代表以根开头,Name是一级字段。

[root@app51 ~] test-vol-1~]

3.查看所有存储卷

docker volume ls [OPTIONS]

常用选项:

-f,--filter 过滤具体存储卷

示例:

[root@app51 ~] -vol-1-vol-2-vol-3~]

过滤某个卷:

[root@app51 ~] -vol-1

4.删除一个或多个卷

  docker volume rm [OPTIONS] VOLUME [VOLUME...]

常用选项:

-f,--force 强制删除存储卷,即使它还在被使用

[root@app51 ~] -vol-1-vol-2-vol-3~] test-vol-3~] -vol-1-vol-2~]

5.移除本地未使用的卷

docker volume prune [OPTIONS]

[root@app51 ~] WARNING! This will remove all local volumes ? [y/-vol-1Total reclaimed space: 0B
[root@app51
~]<span style="color: #008000;">#

 

数据卷的备份与恢复

数据备份

  容器中的数据卷备份有两种方式,一是你可以直接备份与之对应的宿主机目录,二则运行一个容器挂载有数据的容器将其备份到与之对应的宿主机目录。这里演示下第二种数据备份方法。

方法:

1.创建备份容器并挂载需要备份的目录,同时挂载宿主机目录进行备份任务。

2.运行备份指令并将备份数据放到挂载的宿主机目录,以下示例为/backup,将数据备份在来/backup就等于备份在了宿主机的$(pwd)目录下,也就是当前目录。

新建一个数据容器并写入数据:

[root@app51 ~] / /data /data index.html /data total 4 -rw-r--r-- 1 root root 0 Mar 1 07:40 1-rw-r--r-- 1 root root 12 Mar 1 07:40/data

创建备份容器同时挂载两个目录进行数据备份:

[root@app51 ~] /data/ /data/1/data//

查看备份数据:

[root@app51 ~] 总用量 220332 -rw-------. 1 root root 1258 1月 16 00:15 anaconda--rw-r--r-- 1 root root 7 2月 27 10:25-rw-r--r-- 1 root root 10240 3月 1 15:42-rw-r--r-- 1 root root 76 2月 27 19:14-rw-r--r-- 1 root root 578 1月 16 10:41-rw-r--r-- 1 root root 559 1月 16 14:53-rw------- 1 root root 114356736 2月 24 10:56 nginx--rw------- 1 root root 111224320 2月 23 19:18~] drwxr-xr-x root/root 0 2019-03-01 15:40 data/ -rw-r--r-- root/root 0 2019-03-01 15:40 data/1-rw-r--r-- root/root 12 2019-03-01 15:40 data/index.html

数据恢复 

  恢复数据的原理与备份类似,也是启动一个容器共享需要备份的目录,同时挂载宿主机的备份目录,最后解压数据到备份目录中。为了演示数据恢复,我将上述容器 data-c1中的data目录中文件全部删除:

[root@app51 ~] / /data /data

创建一个恢复容器:

[root@app51 ~] data//1/~]

再次查看data-c1容器数据:

/data /data /data /data /data /data total 4 -rw-r--r-- 1 root root 0 Mar 1 07:40 1-rw-r--r-- 1 root root 12 Mar 1 07:40/data

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


最近一直在开发Apworks框架的案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足。遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB、PostgreSQL、RabbitMQ等。当然可以在本机逐一安装这些服务,然后对服务进行配置,使其满足自己开发调试
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。在文本发布和处理微服务中,我打算使用微软的SQL Server for Linux来做演示,于是也就在自己的docker-compose中加入了MS SQL Server的服务。其实在Docker中运行SQL Server是非常容
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。 构建ASP.NET C
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上,写篇文章简单总结一下。 Rook-Ceph是Kubernetes中分布
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件。对于多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础,并且每个指令都开始一个新的构建。您可以选择
本文介绍compose配置文件参数的使用,熟练编写compose文件 [root@docker lnmp]# cat lnmp.yaml version: &#39;3&#39; services: nginx: build: /root/docker_demo/nginx/ ports: - &q
环境 docker-machine主机:192.168.1.9 docker主机:192.168.1.10 步骤: 安装docker-machine 创建ssh密钥对,实现两主机无密登录 创建docker主机,命名host1 变更docker环境变量 运行容器查看两端是否同步 镜像容器同步测试成功
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
https://blog.csdn.net/wanglei_storage/article/details/77508620 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题。 2. Why Need Nginx .NET Core中默认的Web Server为Kestrel。 Kestrel is grea
docker rm `docker ps -a | grep Exited | awk &#39;{print $1}&#39;` 删除异常停止的docker容器 docker rmi -f `docker images | grep &#39;&lt;none&gt;&#39; | awk &#3
什么是Docker Compose 在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。 但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到了以下的一个需求,让我明白了在一台服务器上不得不用多个服务的时
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常。通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程。 VS中的附加进程非常强大,目前提供了9种常用的附加方式。 在当前.Net Core支持跨平台的大背景下,其中Linux环境和
https://www.cnblogs.com/bigberg/p/8867326.html 一、简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编排在一起,同时管理。同样在Swarm集群中,可以使用docker stack 将一组相关联的服务进行
.Net6中想实现对某个网址截屏,可通过Selenium模拟访问网址并实现截图。 实现 安装Nuget包 &lt;PackageReference Include=&quot;Selenium.Chrome.WebDriver&quot; Version=&quot;85.0.0&quot; /&g
原文&#160;https://www.cnblogs.com/gispathfinder/p/5871043.html 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定。 co