浅析Docker Volume理解:docker内文件系统是如何工作的、镜像启动容器是如何工作的、为什么要使用Volume、如何使用Volume、匿名卷与实名卷的区别

一、docker 内文件系统是如何工作的  —— 镜像启动容器的本质

  首先,需要明确 Docker 内的文件系统是如何工作的,Docker镜像被存储在一系列的只读层。

  Docker 镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker 会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层

  如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重启时,之前的修改将会丢失。

  在Docker中,只读层和顶部的读写层的组合被称为联合文件系统(Union File System)

  Docker镜像可以理解成多个只读文件叠加而成,因此镜像是只读的,当镜像运行起来时就相当于在只读的镜像外包裹了一层读写层变成了容器

  当删除容器之后,使用镜像重新创建一个容器时,此时的镜像的只读层和原来一样,只是在读写层的修改会全部丢失

  所以,docker 的数据持久化说的就是数据不随容器的删除而消失

二、为什么要使用数据卷Volume

  Docker的数据卷Volume能让容器从宿主机中读取文件或持久化数据到宿主机主机内,让容器与容器产生的数据分离开来

  可以简单的把Volume理解为Linux服务器上的挂载点,一个容器可以挂载多个不同的目录。

  Volume的生命周期是独立于容器的生命周期之外的,即使容器删除,Volume也会保留下来,Docker也不会因为这个Volume没有被容器使用而回收。在容器中,添加或修改这个文件夹中的文件也不会影响容器的联合文件系统。

  Volume数据卷不使用分层文件系统,这对经常读取和写入的数据很有用。在开发过程中,可以将代码目录挂载到容器中,这样如果更改代码容器会实时地得到文件修改的返回。

  容器中的挂载点必须是绝对路径,不支持相对路径。宿主机上的地址可以是 一个绝对路径,也可以是一个数据卷名称。如果数据卷不存在,Docker会自动创建数据卷。

  注意不要在Dockerfile中指定挂载一个主机的目录,这样做不够灵活,因为在其它主机上不一定会存在这样的目录。

1、如果想要持久化读写层的数据,该怎么利用Docker实现呢?

  为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume数据卷的概念。

  简单来说,Volume数据卷就是目录或文件,可以绕过默认的联合文件系统,以正常的文件或目录的形式存在于宿主机上。Docker使用Volume实现数据的持久化,不仅如此,Volume还能帮助容器和容器之间、容器和主机之间共享数据。

2、Windows下如何挂载容器呢?

  Docker容器的Linux对Windows支持并不是很高,只能对C:Users目录下进行挂载,其它目录没有办法挂载。除非使用VirtualBox修改虚拟机的共享目录设定,否则在虚拟机中只能看到C:Users以下的文件。

三、如何使用数据卷Volume

  在使用 docker run 创建新容器时,可以使用 -v 标签为容器添加数据卷 volume

(1)-v /path   ——   从容器挂载数据卷

(2)-v /host-path:/container-path   ——   从宿主机挂载数据卷

  在Web开发中需要一个Web服务器,使用Nginx镜像为例,将Web开发目录挂载到Nginx容器中:

docker run --rm --name webserver -p 80:80 -v /share/www:/usr/share/nginx/html:ro -d nginx
  • -v 用于挂载一个主机上的目录到容器的目录
    容器内对/usr/share/nginx/html的操作都会反映到主机的/share/www目录内
  • /share/www 表示宿主机上的绝对路径
  • /usr/share/nginx/html 表示容器上的绝对路径
  • ro 表示只读挂载
  查看docker volume帮助文档
docker@default:~$ docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      创建一个数据卷
  inspect     打印一个或多个数据卷的详细信息
  ls          列出所有数据卷
  prune       删除所有未使用的数据卷
  rm          删除一个或多个数据卷

Run 'docker volume COMMAND --help' for more information on a command.

四、什么是匿名卷与实名卷

  匿名卷也就是没有显示指定名字的卷,实名卷具有名字,两种卷均存储在/var/lib/docker/volumes/区域,匿名卷的目录名字是一串随机数字。

  如果在创建容器时添加 --rm 参数,则匿名卷会随着容器的删除而删除。

  其实,匿名卷和实名卷基本可以看成是一个东西,只是匿名卷名字由Docker随机命名,并且可以随容器的销毁而销毁而已。

原文地址:https://www.cnblogs.com/goloving/p/15088002.html