什么是数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和享用
- 对 数据卷 的修改立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即时容器被删除
为什么使用数据卷
- 当创建一个容器的时候,容器运行,数据能不能持久化
- 如果能够持久化,数据存储在哪?由于 docker 是隔离的,数据能不能存储在容器外
- 如果部署很多容器,每次都需要进入容器中进行配置嘛?能不能外部进行配置
docker 数据卷呈现给 docker 容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。使用 Docker 的数据卷,类似在系统中使用 mount 挂载一个文件系统。
数据卷挂载操作
三种挂载数据卷格式
- 具体目录挂载:
docker run [options] -v <宿主机绝对路径:容器内的路径[:ro | rw]> <镜像名>
- 默认目录挂载:
docker run [options] -v <任意别名:容器内的路径[:ro | rw]> <镜像名>
- 匿名目录挂载:
docker run [options] -v <容器内的路径[:ro | rw]> <镜像名>
默认目录挂载和匿名目录挂载的目录默认在 /var/lib/docker/volumes/
目录下。
具体目录挂载
格式:docker run [options] -v <宿主机绝对路径 | 任意别名:容器内的路径[:ro | rw]> <镜像名>
ro
:代表 read-only,容器的路径只允许读,不允许写。不影响宿主机的路径可读可写
rw
:默认值,代表可读可写
具名挂载
[root@k8s-master ~]# docker run -d -p 8081:8080 --name tomcat02 -v /opt/aa:/usr/local/tomcat/webapps tomcat:8.5.73
测试容器和宿主机之间数据共享
#进入tomcat02容器
#进入容器挂载目录
#创建text.txt文件
[root@k8s-master ~]# docker exec -it tomcat02 bash
root@83751adb2f16:/usr/local/tomcat# cd webapps/
root@83751adb2f16:/usr/local/tomcat/webapps# touch text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
text.txt
#在宿主机查看文件
[root@k8s-master ~]# cd /opt/aa/
[root@k8s-master aa]# ls
text.txt
#在宿主机添加test2.txt
[root@k8s-master aa]# touch test2.txt
[root@k8s-master aa]# ls
test2.txt text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
test2.txt text.txt
删除容器
[root@k8s-master ~]# docker rm -f 83751adb2f16
[root@k8s-master aa]# ls
test2.txt text.txt
默认目录挂载
格式:docker run [options] -v <任意别名:容器内的路径[:ro | rw]> <镜像名>
ro
:代表 read-only,容器的路径只允许读,不允许写。不影响宿主机的路径可读可写
rw
:默认值,代表可读可写
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat -v aa:/usr/local/tomcat/webapps tomcat:8.5.27
[root@k8s-master ~]# find / -name aa
/var/lib/docker/overlay2/6bd69f1cc95f446236c6a944a059082b3a79f9d8ea76bdf41e30fc7a61f4ff14/diff/usr/lib/.build-id/aa
/var/lib/docker/overlay2/53bde18c658b564d75ec2e18ff485eca8cb8056ae625613e4cecc11a8695dd5d/merged/usr/lib/.build-id/aa
/var/lib/docker/volumes/aa
/usr/share/locale/aa
/opt/aa
#在宿主机中查看
[root@k8s-master aa]# cd /var/lib/docker/volumes/aa/_data/
[root@k8s-master _data]# ls
docs examples host-manager manager ROOT
#aa 代表一个数据卷名字,可以是任意,这相当于相对路径,它会在 /var/lib/docker/volumes 下创建 aa 目录作为数据卷。
匿名目录挂载
没指定名字的挂载都是匿名挂载,-v 只写了容器内路径,并没写宿主机路径。
匿名目录挂载的目录是:/var/lib/docker/volumes/
,它会在这个目录生成匿名数据卷目录。
格式:docker run [options] -v <容器内的路径[:ro | rw]> <镜像名>
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat03 -v /usr/local/tomcat/webapps tomcat:8.5.27
#没有指定宿主机,docker会自动在/var/lib/docker/volumes生成很长的字符串
[root@k8s-master volumes]# ll
total 24
drwx-----x. 3 root root 19 Feb 26 08:03 57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25
#查看数据卷
[root@k8s-master volumes]# docker volume ls
DRIVER VOLUME NAME
local 57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25
读写权限
启动 tomcat04 容器,挂载到 kele 数据卷里,并赋予只读权限
[root@k8s-master ~]# docker run -d -P --name tomcat04 -v frx:/usr/local/tomcat/webapps:ro tomcat:8.5.27
74dbfe31c4a5f47f66c3f2b807d5944d7eefc711d2b576a82fa6485ac8079d69
[root@k8s-master ~]# docker volume ls
DRIVER VOLUME NAME
local frx
#到宿主机目录下查看,并新建文本文件
[root@k8s-master ~]# cd /var/lib/docker/volumes/frx/_data/
[root@k8s-master _data]# touch test1.txt
[root@k8s-master _data]# ls
docs examples host-manager manager ROOT test1.txt
#进入容器查看是否可读,不允许写
[root@k8s-master ~]# docker exec -it tomcat04 /bin/bash
root@74dbfe31c4a5:/usr/local/tomcat# cd webapps/
root@74dbfe31c4a5:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager test1.txt
root@74dbfe31c4a5:/usr/local/tomcat/webapps# touch test2.txt
touch: cannot touch 'test2.txt': Read-only file system
数据卷操作命令
#数据卷查看
docker volume ls
#查看frx数据卷的具体信息
[root@k8s-master ~]# docker volume inspect frx
#数据卷创建
docker volume create Myvolume
#数据卷删除
docker volume rm -f Myvolume