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
- 功能:创建存储卷
docker volume create [OPTIONS] [VOLUME]
- 参数:
- -d:指定驱动,默认是 local
- –label:指定元数据(标签,给卷添一些备注信息)
通过这种方式创建出来的卷的默认的目录是/data/var/lib/docker/volumes/
。
--label
是设置卷的备注信息。
2.1.2 docker volume inspect
- 功能:查看卷详细信息(上面的演示)
docker volume inspect VOLUME
2.1.3 docker volume ls
- 功能:列出所有的卷
docker volume ls [OPTIONS]
- 参数:
- –format:指定相应个格式,如 json,table
- -f:过滤
- -q:仅显示名称
2.1.4 docker volume rm
- 功能:删除卷,需要容器不使用。
docker volume rm [OPTIONS] VOLUME [VOLUME...]
- 参数:-f:强制删除
2.1.5 docker volume prune
- 功能:删除不使用的本地卷
docker volume prune [OPTIONS]
- 参数:
- –filter:过滤
- -f:不提示是否删除
2.2 -v 或者–mount 指定
2.2.1 -V 参数
docker run -v name:directory[:options]
- 参数
- 第一个参数:卷名称
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如
ro
表示readonly
(表示只读,不允许删除容器中的文件)
# 运行一个容器
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/ nginx:1.24.0
运行一个容器,将容器/user/share/nginx/html/
目录下的文件自动拷贝
到volnginx1
卷上(自己创建这个卷)。
- 如果删除容器中的文件,宿主机将会跟着删除。
为了避免上面的这种情况,就要加上 :ro
就可避免容器
中的文件被删除。ro
它表示只读,可以修改宿主机的文件,但是容器里的文件修改不了。
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/:ro nginx:1.24.0
2.2.2 --mount 参数
- 功能:完成目录映射
--mount '<key>=<value>,<key>=<value>'
- 参数:
type
:类型表示bind, volume, tmpfs
。src
:对于命名卷,这是卷的名称。对于匿名卷(名称为一串字符串),省略此字段。dst
,target
:文件或目录挂载在容器中的路径。ro
,readonly
:只读方式挂载。
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 参数创建卷
- 功能:完成卷映射
docker run -v name:directory[:options]
- 参数:
- 第一个参数:宿主机目录,这个和管理卷是不一样的。(随着写法变动)
- 第二个参数:卷映射到容器的目录。
- 第三个参数:选项,如
ro
表示readonly
。
# 运行并绑定
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
文件,没有拷贝过来。
# 查看详细信息
docker inspect mynginx6
3.2 --mount 参数
这跟 -v
是很相似的,就是将卷的名称替换为宿主机的目录
,区别是一定要加上type
参数,bind
表示绑定卷。
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
docker run --name mynginx8 -d --tmpfs /test1 nginx:1.24.0
可以通过 docker inspect mynginx8
来查看。
/test1
在容器的目录中,但是数据是存储在内存中的。如果容器重启,那么该目录下的。
4.2 --mount 参数
--mount '<key>=<value>,<key>=<value>'
- 参数:
- type:类型表示 bind, volume,tmpfs。
- src:宿主机目录,这个和管理卷是不一样的。
- dst,target:文件或目录挂载在容器中的路径。
- ro,readonly:只读方式挂载。
只需要 type
类型为 tmpfs
就行了。
docker run -d -p 80:80 --name bind1 --mount type=tmpfs,source=/root/data,target=/usr/share/nginx/html nginx:1.24.0