实验环境docker-engine版本V1.13

根据v1.13版的docker文档,说明了volume的几个特点:

  1. 可以绕过文件系统,存在于一个或多个容器中
  2. 独立于容器的生命周期,并且在容器销毁以后,volume 不会被自动删除或是垃圾回收
  3. 分三类:
  • host volume:在宿主机上,可从容器内访问
  • named volume:docker管理volume位置,有名字
  • anonymous volume:docker管理volume位置,没有名字

docker volume命令有下面几个子命令:

1、docker volume create

最基本的,创建本地卷:

[root@localhost ~]# docker volume create hello
hello
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               hello

创建一个自定义参数的卷:

create命令可以创建一个卷,默认的driver是local ,它类似于linux中的mount命令,也可以挂上几个自定义的参数,如下:
type表示文件系统类型,device表示设备,o表示mount命令的参数,用,分隔不同的参数

[root@localhost ~]# docker volume create --driver local \
    --opt type=tmpfs \
    --opt device=tmpfs \
    --opt o=size=100m,uid=1000 \
    foo
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               foo

运行一个容器并挂载这个卷

[root@localhost ~]# docker run -it --rm -v foo:/opt/foo busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
1cae461a1479: Pull complete 
Digest: sha256:c79345819a6882c31b41bc771d9a94fc52872fa651b36771fbe0c8461d7ee558
Status: Downloaded newer image for busybox:latest
/ # cd opt/
/opt # ls -l
total 0
drwxrwxrwt    2 1000     root            40 May 11 17:57 foo

可以看到,卷已经挂载了,并且uid设置为了1000

创建一个网络目录作为卷:

[root@localhost /]# docker volume create --driver=local \
    --opt type=nfs \
    --opt o=addr=192.168.0.105,rw \
    --opt device=:/opt/test \
    foo
foo

查看卷foo的详细信息:

[root@localhost /]# docker volume inspect foo
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/foo/_data",
        "Name": "foo",
        "Options": {
            "device": ":/opt/test",
            "o": "addr=192.168.0.105,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]

运行一个容器测试卷的情况:

[root@localhost /]# docker run -it --rm -v foo:/opt/foo busybox /bin/sh
/ # cd /opt/foo
/opt/foo # ls
hahaha

可以看到,在/opt/foo目录中有网络卷中创建的文件,挂载成功。

2、docker volume inspect

这个命令比较简单,只有一个参数--format, -f这也是docker中各种inspect命令中相同的特点,栏目1中已经使用过这个命令,这里加入参数指定要查看的项:

[root@localhost /]# docker volume inspect --format '{{ .Mountpoint }}' foo
/var/lib/docker/volumes/foo/_data

对比栏目1中的结果,这里显示的特定的输出。

3、docker volume ls

这个命令也比较简单,和inspect类似,可以通过--format, -f指定输出的格式,由于volume有下表中的几个属性,所以可以根据他们进行定制输出:

属性

描述

Driver

卷驱动

Labels

标签

Mountpoint

宿主机挂载点

Name

名称

Options

挂载参数

Scope

作用域

如下命令定制输出的信息:

[root@localhost /]# docker volume ls --format "{{.Name}}: {{.Driver}}"
foo: local
foo1: local
foo2: local

--quiet, -q命令可以简洁的只输出volume名,方便作为参数输入到别的命令中去。

[root@localhost /]# docker volume ls --quiet
foo
foo1
foo2

4、docker volume prune

删除所有没用的volume,危险操作,慎用!

5、docker volume rm

删除指定的volume

[root@localhost /]# docker volume rm foo2
foo2