数据卷介绍
为什么要用数据卷
1.宿主机无法直接访问容器中的文件
2.容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
3.容器与主机之间、容器与容器之间共享文件
4.容器中数据的持久化将容器中的数据备份、迁移、恢复等
数据卷特点
1.数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的
2.数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换
3.容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中
4.容器对数据卷的修改是实时进行的,数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
数据卷挂载
数据卷三种挂载方式
1.bind mounts:将宿主机上的一个文件或目录被挂载到容器上
2.volumes:由Docker创建和管理。使用docker volume命令管理
3.tmpfs mounts:tmpfs是一种基于内存的临时文件系统。tmpfs mounts数据不会存储在磁盘上
bind mounts方式挂载数据卷
1.利用docker run/create 的参数为容器挂载数据卷
2.用法:
- -v,–volume参数:
-v 宿主机文件或者文件夹:容器中的文件或者文件夹路径
- –mount参数:
--mount type=bind,src=宿主机文件或文件夹路径,dst=容器中的文件或者文件夹路径
;
–mount方式中的src指定的文件和路径必须提前创建或存在
3.案例演示
用-v
参数将宿主机/opt/demo1
目录映射到容器内的/root/c_dir1
目录,示例如下
$ docker run -dit -v /opt/demo1:/root/c_dir1 ubuntu
用--mount
参数将宿主机/opt/demo2
目录映射到容器内的/root/c_dir2
目录
# 直接运行挂载命令,报错,提示非法挂载目录,源目录不存在
xiaoran@cjdll:~$ docker run -dit --mount type=bind,src=/opt/demo2,dst=/root/c_dir2 ubuntu
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /opt/demo2.
See 'docker run --help'.
# 创建文件夹
xiaoran@cjdll:~$ sudo mkdir /opt/demo2
# 再次挂载成功
xiaoran@cjdll:~$ docker run -dit --mount type=bind,src=/opt/demo2,dst=/root/c_dir2 ubuntu
a2c96c35f3535f9c390cc6be15622eb1dadfd5aca56ffeb20bbeb39fbafc3c70
volumes方式挂载数据卷
用法
1.-v,–volume参数:-v VOLUME_NAME:容器中的文件或者文件夹路径
2.–mount参数:--mount type=volume,src=VOLUME_NAME,dst=容器中的文件或者文件夹路径
3.volume管理命令
docker volume create 创建一个数据卷
docker volume inspect 查看数据卷详细信息
docker volume ls 查看已经创建的数据卷对象
docker volume prune 删除未被使用的数据卷对象
docker volume rm 删除一个或多个数据卷对象
使用案例
用-v
参数,将数据卷名为volume-demo
的数据卷映射到容器内的/root/c_dir3
目录
$ docker run -dit -v volume-demo:/root/c_dir3 ubuntu
ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b
查看创建的数据卷
$ docker volume ls
DRIVER VOLUME NAME
local volume-demo
查看volume-demo
的数据卷详细信息,发现路径为宿主机的/var/lib/docker/volumes/volume-demo/
$ docker volume inspect volume-demo
[
{
"CreatedAt": "2023-03-03T10:32:59+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/volume-demo/_data",
"Name": "volume-demo",
"Options": null,
"Scope": "local"
}
]
删除数据卷前需要先删除对应的容器,否则无法删除
xiaoran@cjdll:~$ docker volume rm volume-demo
Error response from daemon: remove volume-demo: volume is in use - [ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b]
xiaoran@cjdll:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad5912c67f62 ubuntu "/bin/bash" About a minute ago Up About a minute nice_wescoff
xiaoran@cjdll:~$ docker stop ad59
ad59
xiaoran@cjdll:~$ docker volume rm volume-demo
Error response from daemon: remove volume-demo: volume is in use - [ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b]
xiaoran@cjdll:~$ docker rm ad5
ad5
xiaoran@cjdll:~$ docker volume rm volume-demo
volume-demo
xiaoran@cjdll:~$ docker volume ls
DRIVER VOLUME NAME
–mount参数用法类似。
tmpfs mount方式挂载数据卷
用法
# PATH为容器内部路径
--mount type=tmpfs,dst=PATH
案例
xiaoran@cjdll:~$ docker run -dit --mount type=tmpfs,dst=/root/c_dir3 ubuntu
eb5e13c3f92e4e073ecc2d6caccfef9a58a3663314a3bf790549993953b31a79
数据卷使用注意
1.如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
2.如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉
总结
待更新
评论区