学科分类
目录
Docker

Volumes数据卷使用

了解了数据卷的优势后,接下来就以数据卷为例来演示Docker如何进行数据管理。

1. 创建并管理数据卷

(1)创建数据卷

在Docker主机终端,通过docker volume create指令创建一个名为my-vol的数据卷,具体操作指令如下。

$ docker volume create my-vol

(2)查看数据卷

使用docker volume ls指令查看本地数据卷列表,具体操作指令如下。

$ docker volume ls

执行上述指令后,会列举出本地Docker机器上的所有数据卷,效果如图1所示。

图1 列举数据卷

从图1可以看出,新创建的my-vol数据卷已经显示在本地Docker机器上,这说明数据卷创建成功。

(3)核查数据卷

使用docker volume inspect指令查看指定数据卷详情,具体操作指令如下。

$ docker volume inspect my-vol

执行上述指令后,会将名为my-vol的数据卷的详细信息展示出来,效果如图2所示。

图2 数据卷详情

(4)删除数据卷

当不再需要使用数据卷后,可以使用docker volume rm指令删除指定名称的数据卷,具体操作指令如下。

$ docker volume rm my-vol

执行上述指令后,会将名为my-vol的数据卷删除,当删除成功后会返回该数据卷名称。

2. 启动容器并加载数据卷

前面单独使用docker volume数据卷管理指令演示了数据卷的基本操作,接下来将结合具体的容器,来演示如何在容器创建时配置并管理docker volume数据卷。

(1)查看本机容器和数据卷

在Docker主机终端分别使用docker ps -a和docker volume ls指令查看本地Docker机器上存在的容器和数据卷,效果如图3所示。

图3 容器和数据卷列表

从图3可以看出,目前本地Docker主机上没有任何容器和数据卷。为了避免后续示例演示的干扰,如果机器上已经存在容器和数据卷,最好将已存在的容器和数据卷删除。

(2)确认查看本机Docker文件系统中的容器和数据卷

首先在Docker主机终端中将普通用户切换到root用户,然后进入“/var/lib/docker”目录,即Docker默认在本机上的文件系统目录,查看信息,效果如图4所示。

图4 Docker机器文件系统

从图4可以看出,本地Docker机器的文件系统中包含了两个重要的文件目录,分别为containers和volumes,这两个文件目录就是用于存放用户创建的容器和数据卷的。因为前面已经确认Docker机器上没有任何容器和数据卷,所以这两个文件目录是空的。

(3)启动容器并挂载数据卷

使用docker run指令创建并启动一个容器,同时挂载一个数据卷,具体操作指令如下。

$ docker run -d \
 -it \
 --name devtest \
 --mount source=myvol,target=/app \
 busybox:latest

也可以使用-v参数挂载数据卷,具体操作指令如下。

$ docker run -d \
 -it \
 --name devtest2 \
 -v myvol:/app \
 busybox:latest

在上述两种指令中,首先通过docker run指令创建并启动一个容器,并指定创建容器的名称分别为devtest和devtest2,然后分别通过--mount和-v两种参数来实现数据卷的挂载。这两个容器共享了同一个数据卷myvol,并将该数据卷挂载到了各自容器中的app目录下。

上述指令中出现的两个新的参数--mount和-v参数,需要进一步说明,具体如下所示。

--mount参数

由多个key=value形式的键值对组成,键值对之间由英文逗号分隔。--mount参数语法比-v更为详细,键的顺序可随意,标记的值也更容易理解。关于--mount参数的键值说明具体如下。

● type(挂载的类型):可以是bind、volume 或tmpfs。当前使用的是数据卷,因此类型是volume。

● source(挂载源):对于命名的数据卷来说,这就是数据卷的名称,而对于匿名卷,该字段被省略,该字段可以用source或src表示。

● destination(挂载点):就是将文件或目录挂载到容器中的具体路径,该字段可以用destination、dst或target表示。

●readonly参数,如果出现了该参数,则挂载到容器中的数据就表示是只读了。

-v(--volume的缩写)参数

由三个字段组成,分别由冒号(:)分隔,字段必须以正确的顺序排列,而且每个字段的含义都特别明确。关于-v参数的属性值的说明具体如下。

● 在命名卷的情况下,第一个字段是数据卷的名称,在给定的主机上是惟一的;对于匿名卷,将会省略第一个字段。

● 第二个字段是在容器中挂载数据的文件或目录的路径。

● 第三个字段是可选的,是一个逗号分隔的参数列表,例如ro(readonly,即只读)。

小提示:

在Docker的早期版本中,-v(--volume的缩写)标签用于独立容器,而--mount标签则用于Swarm群集服务,从Docker17.06开始,--mount标签也用于独立容器。总的来说,--mount标签更加明确和详细,这两种标签的最大区别在于-v语法将所有参数组合在一个字段中,而--mount语法将它们分开。针对数据管理中Volumes数据卷涉及到的两个标签-v和--mount的选择,对于初学者来讲,更适合使用--mount,因为它更详细且容易理解;对于有一定经验的开发者来说,可能更习惯使用-v标签,因为它更简洁。

需要注意的是,本小节讲解的是使用Volumes进行数据管理,不管是--mount source=myvol还是-v myvol,前面第一个参数都是设置的数据卷名称。执行完指令后,会自动在Docker文件系统的数据卷目录/var/lib/docker/volumes下创建一个myvol子目录来保存数据。如果是使用Bind mounts(绑定挂载)进行的数据管理,那么第一个参数就是宿主机保存数据的具体地址(例如-v /src/myvolume/data:/app)。

(4)再次查看本机容器和数据卷列表

在Docker主机终端分别使用docker ps -a和docker volume ls指令查看本地Docker机器上存在的容器和数据卷,效果如图5所示。

图5 容器和数据卷列表

从图5可以看出,容器创建成功后自动加载了数据卷。值得一提的是,如果在创建容器时数据卷不存在,则Docker会自动创建。

(5)检查容器详情

在Docker主机终端使用docker inspect指令查看容器详情(主要查看数据挂载信息),效果如图6所示。

图6 容器数据卷挂载信息

从图6可以看出,容器数据挂载了Mounts信息,其中包括挂载类型为volume、数据卷名称为myvol、数据在本地Docker机器上的对应存储地址、数据在容器中的对应地址app目录以及容器中的数据是可读写的(RW:true)等。

(6)再次确认本机Docker文件系统中的容器和数据卷

首先在Docker主机终端中将普通用户切换到root用户,然后进入/var/lib/docker目录,然后分别进入containers容器文件目录和volumes数据卷文件目录查看内容,结果如图7所示。

图7 Docker机器容器和数据卷文件系统

从图7可以看出,新建的两个容器和数据卷已自动生成在本地Docker文件目录中。此时,如果我们将两个容器都删除,则本地Docker文件目录中的容器也会自动消失,但数据卷却可以保留,除非数据卷也被删除。

点击此处
隐藏目录