其实想写这篇文章已经好几天了,但是一直没有搞明白这个东西到底该怎么操作,然后又不知道从何处入手,也去查阅了很多资料,终于搞明白了一点,下面是我最近的实验总结,总共分为五个部分,第一部分介绍volume的介绍和作用,第二个部分是 挂载在容器,第三个部分是系统目录挂载在容器,第四个部分是Windows目录挂载在容器,第五部分介绍volume的操作命令,那么我们就先来了解一下

什么是volume?

要想知道什么是docker volume ,那么首先要知道docker文件是怎么运行的?最初的几篇文章docker简介》已经结合图文说明了,那么这里再简单说一下。


  Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层.如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失.Docker,只读层以及在顶部的读写层的组合被称为Union FIle System(联合文件系统)。

  为了能够保存(持久)数据以及共享容器间的数据,Docker提出了Volumes的概念。很简单,volumes是目录(或者文件),它们是外部默认的联合文件系统或者是存在于宿主文件系统正常的目录和文件。


为什么使用数据卷volume?(这段内容参照其他博客)

        Docker的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。

   (1)容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问

   2)多个容器之间的数据无法共享

   3)当删除容器时,容器产生的数据将丢失

  为了解决这些问题,Docker引入了数据卷(volume)机制。volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。

   (1volume在容器创建时就初始化,在容器运行时就可以使用其中的文件

   2volume能在不同的容器之间共享和重用

   (3)对volume中的数据的操作会马上生效

   4)对volume中数据操作不会影响到镜像本身

   5volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除

Docker Volume 挂载

主要有两种参数方式挂载,一种是 -v,另一种是创建数据卷容器,以--volumes-from 挂载。

-v [host-dir]:[container-dir]:[rw|wo]

· host-dir:表示主机上的目录,如果不存在,Docker 会自动在主机上创建该目录。

· container-dir:表示容器内部对应的目录,如果该目录不存在,Docker 也会在容器内部创建该目录。

· rw|ro:用于控制卷的读写权限。

Windows下挂载特殊说明

Windows/Mac OS X下的docker是运行在一个Linux虚拟机的, 在这个虚拟机里,运行多个容器。本文是在Windows环境下的,所以会有点不同。这里要借助docker-machine来完成操作,Linux环境无需。

我们先通过命令连接到docker运行的linux虚拟机

docker-machine ssh default


我们看到已经可以进来了,此时的用户是docker,如果你用这个账号直接操作的话,到后面的文件目录会发现出现这样的错误:ls: can't open '/f/data/zhicall_balance': Permission denied

没有权限,这个时候需要将docker用户切换成root用户才能继续操作

sudo -i

接下来都是在root账号的权限操作的




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐