1. 什么是存储卷?
存储卷就是将宿主机的本地文件系统中存在的某个目录 直接与容器内部的文件系统上的某一目录 建立绑定关系 。使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。
存储卷可以分为三类:
- 管理卷 :默认映射到宿主机的
/var/lib/docker/volumes
目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎daemon
自行创建一个空的目录。 - 绑定数据卷:映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径。
- 临时数据卷 :映射到于宿主机内存中,一旦容器停止运行,
tmpfs、mounts
会被移除,数据就会丢失,用于高性能的临时数据存储。
2. 管理卷
存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v
and --mount
指定。
2.1 Volume 命令操作
命令 | 功能 |
---|---|
docker volume create | 创建存储卷 |
docker volume inspect | 显示存储卷详细信息 |
docker volume ls | 列出存储卷 |
docker volume prune | 清理所有无用数据卷 |
docker volume rm | 删除卷,使用中的无法删除 |
2.1.1 docker volume create
- 功能:创建存储卷
shell
docker volume create [OPTIONS] [VOLUME]
- 参数:
- -d:指定驱动,默认是 local
- --label:指定元数据(标签,给卷添一些备注信息)
通过这种方式创建出来的卷的默认的目录是/data/var/lib/docker/volumes/
。
--label
是设置卷的备注信息。
2.1.2 docker volume inspect
- 功能:查看卷详细信息(上面的演示)
shell
docker volume inspect VOLUME
2.1.3 docker volume ls
- 功能:列出所有的卷
shell
docker volume ls [OPTIONS]
- 参数:
- --format:指定相应个格式,如 json,table
- -f:过滤
- -q:仅显示名称
2.1.4 docker volume rm
- 功能:删除卷,需要容器不使用。
shell
docker volume rm [OPTIONS] VOLUME [VOLUME...]
- 参数:-f:强制删除
2.1.5 docker volume prune
- 功能:删除不使用的本地卷
shell
docker volume prune [OPTIONS]
- 参数:
- --filter:过滤
- -f:不提示是否删除
2.2 -v 或者--mount 指定
2.2.1 -V 参数
shell
docker run -v name:directory[:options]
- 参数
- 第一个参数:卷名称
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如
ro
表示readonly
(表示只读,不允许删除容器中的文件)
shell
# 运行一个容器
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/ nginx:1.24.0
运行一个容器,将容器/user/share/nginx/html/
目录下的文件自动拷贝
到volnginx1
卷上(自己创建这个卷)。
- 如果删除容器中的文件,宿主机将会跟着删除。
为了避免上面的这种情况,就要加上 :ro
就可避免容器
中的文件被删除。ro
它表示只读,可以修改宿主机的文件,但是容器里的文件修改不了。
shell
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/:ro nginx:1.24.0
2.2.2 --mount 参数
- 功能:完成目录映射
shell
--mount '<key>=<value>,<key>=<value>'
- 参数:
type
:类型表示bind, volume, tmpfs
。src
:对于命名卷,这是卷的名称。对于匿名卷(名称为一串字符串),省略此字段。dst
,target
:文件或目录挂载在容器中的路径。ro
,readonly
:只读方式挂载。
shell
docker run -d --name mynginx4 --mount 'src=nginxvol4,dst=/usr/share/nginx/html,ro' nginx:1.24.0
将容器中/usr/share/nginx/html
目录下的文件与nginxvol4
卷相映射。
- 如果删除容器,卷是不会删除的,也就说宿主机中的文件会保留(这也是卷的作用)。
- 如果修改宿主机中的文件,容器里的文件会自动更新(前提是容器不是只读模式)。
3 绑定卷
绑定卷跟管理卷中的 -v、----mount是一样的。
3.1 -v 参数创建卷
- 功能:完成卷映射
shell
docker run -v name:directory[:options]
- 参数:
- 第一个参数:宿主机目录,这个和管理卷是不一样的。(随着写法变动)
- 第二个参数:卷映射到容器的目录。
- 第三个参数:选项,如
ro
表示readonly
。
shell
# 运行并绑定
docker run -d --name mynginx6 -v /root/data:/usr/share/nginx/html nginx:1.24.0
这时候就是将宿主机中的/root/data
目录与容器中的/usr/share/nginx/html
目录相绑定。这时候容器和宿主机中的初始文件都消失了(index.html)。
/root/data
目录下没有html
文件,没有拷贝过来。
shell
# 查看详细信息
docker inspect mynginx6
3.2 --mount 参数
这跟 -v
是很相似的,就是将卷的名称替换为宿主机的目录
,区别是一定要加上type
参数,bind
表示绑定卷。
shell
docker run -d --name myngixn7 --mount type=bind,src=/root/data,dst=/usr/share/nginx/html nginx:1.24.0
-v 与 --mount 的区别: -v 创建卷的时候,宿主机的目录可以不用存在;而 --mount 必须先创建目录再绑定,不然会报错。
4.临时卷
临时卷数据位于内存中,在容器与宿主机之外。
4.1 指定 --tmpfs 创建
在创建一个临时目录/test1
shell
docker run --name mynginx8 -d --tmpfs /test1 nginx:1.24.0
可以通过 docker inspect mynginx8
来查看。
/test1
在容器的目录中,但是数据是存储在内存中的。如果容器重启,那么该目录下的。
4.2 --mount 参数
shell
--mount '<key>=<value>,<key>=<value>'
- 参数:
- type:类型表示 bind, volume,tmpfs。
- src:宿主机目录,这个和管理卷是不一样的。
- dst,target:文件或目录挂载在容器中的路径。
- ro,readonly:只读方式挂载。
只需要 type
类型为 tmpfs
就行了。
shell
docker run -d -p 80:80 --name bind1 --mount type=tmpfs,source=/root/data,target=/usr/share/nginx/html nginx:1.24.0