一.存储卷(Volume)
1.概念
Docker容器是易失的,默认情况下,Docker容器销毁,里面的数据也就没有了。但是有的时候我们并不想让这些数据消失,因此Docker为我们提供了存储卷这个方式来避免这个问题。
存储卷就是将宿主机的本地文件系统 中存在的某个目录直接与容器内部文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。
在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
宿主机的/data/web 目录与容器中的/container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容 ,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。
2.存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中:
1)volume docker 管理卷,默认映射到宿主机的 /var/lib/docker/volumes 目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合;
2)bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系;
3)tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

二.管理卷 Volume
1.命令
1)docker volume create
创建存储卷。
语法:
docker volume create [OPTIONS] [VOLUME]
关键参数:
|-------------|----------------|
| -d,--driver | 指定驱动,默认是 local |
| --label | 指定元数据 |

2)docker volume inspect
查看卷详细信息。
语法:
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
关键参数:
|----|--------------|
| -f | 指定相应格式,如json |

3)docker volume ls
列出卷。
语法:
docker volume ls [OPTIONS]
关键参数:
|-------------|----------------------|
| --format | 指定相应个格式,如 json,table |
| --filter,-f | 过滤 |
| -q | 仅显示名称 |

4)docker volume rm
删除卷,需要容器不使用。
语法:
docker volume rm [OPTIONS] VOLUME [VOLUME...]
关键参数:
|------------|------|
| -f,--force | 强制删除 |

5)docker volume prune
删除没有被任何容器引用的本地卷。
语法:
docker volume prune [OPTIONS]
关键参数:
|------------|---------|
| --filter | 过滤 |
| -f,--force | 不提示是否删除 |

2.-v 或者 --mount 创建卷
1)-v
完成目录映射。
语法:
docker run -v name:directory[:options] ......
docker run -v 卷名称:卷映射到容器的目录[选项] ......
2)--mount
完成目录映射。
语法:
docker run --mount '<key>=<value>,<key>=<value>'
关键参数:
|------------------------|-----------------------------|
| type | 类型表示 bind, volume, or tmpfs |
| source ,src | 对于命名卷,这是卷的名称。对于匿名卷,省略此字段 |
| destination,dst,target | 文件或目录挂载在容器中的路径 |
| ro,readonly | 只读方式挂载 |
3.Dockerfile 匿名卷
通过 Dockerfile 的 VOLUME 可以创建 docker 管理卷。
也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。
三.绑定卷 bind mount
1.创建
1)-v 创建卷
完成卷映射。
语法:
docker run -v name:directory[:options] .........
docker run -v 宿主机目录:卷映射到容器的目录[选项] .........
2)--mount 创建卷
完成目录映射。
语法:
docker run --mount '<key>=<value>,<key>=<value>'
关键参数:
|------------------------|-----------------------------|
| type | 类型表示 bind, volume, or tmpfs |
| source,src | 宿主机目录,这个和管理卷是不一样的 |
| destination,dst,target | 文件或目录挂载在容器中的路径 |
| ro,readonly | 只读方式挂载 |
四.临时卷 tmpfs
临时卷数据位于内存中,在容器和宿主机之外。tmpfs有一点局限性:不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载;另外这个功能只有在 Linux 上运行 Docker 时才可用。
1.创建
1)指定 --tmpfs 创建
完成临时卷映射。
语法:
--tmpfs /app
2)--mount 指定参数创建
完成目录映射。
语法:
--mount '<key>=<value>,<key>=<value>'
关键参数:
|------------------------|---------------------------------------------|
| type | 类型表示 bind, volume, or tmpfs |
| destination,dst,target | 挂载在容器中的路径 |
| tmpfs-size | tmpfs 挂载的大小(以字节为单位)。默认无限制 |
| tmpfs-mode | tmpfs 的八进制文件模式。例如,700 或 0770。默认为 1777 或全局可写 |