存储驱动
由storage driver管理的镜像层和可读写层
数据卷
- 概念
Data Volume本质上是Data Host文件系统中的文件或目录,能够被直接mount到容器的文件系统中。
- 特点
1.Data Volume是目录或文件,而非没有格式化的磁盘
2.容器可以读写Volume中的数据
3.volume数据可以永久保存,即使使用它的容器已经销毁
- Volume容量
因为Volume是docker host文件系统的一部分,所以volume的容量取决于文件系统当前未使用的空间,目前没有办法设置
- Data Volume类型
1.bind mount
2.docker managed volume
Bind Mount
- 概念
bind mount是将host上已存在的目录或文件 mount到容器
- 挂载数据卷
-v:通过-v参数将host的目录挂载到容器中
格式: -v <host path>:<container path>
-v ~/html:/usr/share/nginx/html 挂载源:挂载点
- 案例1(挂载源是目录)
#会覆盖容器原有的数据
1.更换nginx容器的index.html文件
[root@docker ~]# mkdir html
[root@docker html]# echo "this is a web server" >index.html
[root@docker ~]# docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html nginx
[root@docker ~]# curl 127.0.0.1
this is a web server
2.更新宿主机文件
[root@docker html]# echo "this is a index page" >index.html
[root@docker ~]# curl 127.0.0.1
this is a index page
3.删除容器
[root@docker html]# docker rm -f web
[root@docker ~]# ls
html
- 案例2(挂载源是文件)
#只是修改容器中原有数据目录的某个文件
[root@docker html]# docker run -d -p 80:80 --name web -v ~/html/index.html:/usr/share/nginx/html/index.html nginx
- 数据读写权限
1.默认是可读可写
[root@docker ~]# docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html nginx
2.设置只读权限
[root@docker html]# docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html:ro nginx
- 特性
1.方便数据迁移和备份
2.容器移植性差
Docker managed volume
- 概念
docker managed volume与bind mount的最大区别是不需要指定mount源,指明mount point就可以了
- 挂载数据卷
格式: -v
-v /usr/share/nginx/html
- 案例
#启动容器
[root@docker ~]# docker run -d -p 80:80 --name web -v /usr/share/nginx/html nginx
[root@docker ~]# docker inspect web|grep -A 10 -i mounts
"Mounts": [
{
"Type": "volume",
"Name": "e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f",
"Source": "/var/lib/docker/volumes/e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
[root@docker _data]# ls /var/lib/docker/volumes/e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f/_data
#更新挂载源数据
[root@docker _data]# echo "this is a web server">index.html
- 查看数据卷
#docker inspect
[root@docker ~]# docker inspect web
#docker volume
[root@docker ~]# docker volume ls
[root@docker ~]# docker volume inspect 6a80f16365009629a4e99184d377f482b23fb7420002dc536808843834ccbd35
- bind mount 和 docker managed volume对比
1)相同点: 两者都是host文件系统中的某个路径
(2)不同点:
不同点 bind mount docker managed volume volume位置 可任意指定 /var/lib/docker/volumes/ 对已有挂载点的影响 隐藏并替换为volume 原有数据复制到volume 是否支持单个文件 支持 不支持,只能是目录 权限控制 可设置为只读,默认为读写权限 无控制,均为读写权限 移植性 移植性弱,与host path绑定 移植性强,无须指定host目录
容器之间共享数据
bind mount
#创建三个容器,将同一个共享目录分别挂载到容器目录里
[root@docker ~]# docker run -d -p 80:80 --name web1 -v ~/html:/usr/share/nginx/html nginx
[root@docker ~]# docker run -d -p 81:80 --name web2 -v ~/html:/usr/share/nginx/html nginx
[root@docker ~]# docker run -d -p 82:80 --name web3 -v ~/html:/usr/share/nginx/html nginx
#分别测试三个容器
[root@docker ~]# curl 127.0.0.1:80
this is a web server
[root@docker ~]# curl 127.0.0.1:81
this is a web server
[root@docker ~]# curl 127.0.0.1:82
this is a web server
#修改volume中的数据,再次测试
[root@docker html]# echo "this is a index page">index.html
[root@docker html]# curl 127.0.0.1:80
this is a index page
[root@docker html]# curl 127.0.0.1:81
this is a index page
[root@docker html]# curl 127.0.0.1:82
this is a index page
volume container(数据卷容器)
- 概念
volume container是专门为其他容器提供volume的容器,提供的卷可以使bind mount,也可以是docker managed volume。
- 案例
1. 使用bind mount创建一个volume container
[root@docker ~]# docker create --name vc_data \
> -v ~/html:/usr/share/nginx/html \
> -v /root/tools:/tools \
> busybox
#查看容器的volume
[root@docker ~]# docker inspect vc_data|grep -A 20 -i "mounts"
#其他容器使用--volumes-from使用这个容器提供的volume
[root@docker ~]# docker run -d -p 80:80 --name web1 --volumes-from vc_data nginx
[root@docker ~]# docker run -d -p 81:80 --name web2 --volumes-from vc_data nginx
[root@docker ~]# docker run -d -p 82:80 --name web3 --volumes-from vc_data nginx
#测试容器
[root@docker ~]# curl 127.0.0.1
this is a index page
[root@docker ~]# curl 127.0.0.1:81
this is a index page
[root@docker ~]# curl 127.0.0.1:82
this is a index page
2. 使用docker managed volume创建一个volume container
[root@docker ~]# docker create --name vc_data \
> -v /usr/share/nginx/html \
> -v /tools \
> busybox
#查看容器的volume
[root@docker ~]# docker inspect vc_data|grep -A 20 -i "mounts"
#其他容器使用--volumes-from使用这个容器提供的volume
[root@docker ~]# docker run -d -p 80:80 --name web1 --volumes-from vc_data nginx
[root@docker ~]# docker run -d -p 81:80 --name web2 --volumes-from vc_data nginx
[root@docker ~]# docker run -d -p 82:80 --name web3 --volumes-from vc_data nginx
#添加index页面到数据卷
#测试容器
[root@docker ~]# curl 127.0.0.1
this is a index page
[root@docker ~]# curl 127.0.0.1:81
this is a index page
[root@docker ~]# curl 127.0.0.1:82
this is a index page
- 特点
1.与bind mount相比,不必为每一个容器指定 host path,实现了容器与host的解耦
2.使用volume container的容器,其mount point都是一致的,有利于配置的规范和标准化
Data volume 生命周期管理
- 备份
概念:
对volume的备份实际上就是备份host文件系统中的目录和文件
案例:
#创建容器
docker run -d --name demo -v ~/html:/usr/share/nginx/html nginx
#备份host目录
cp -r html html_bak
- 恢复
概念:
数据损坏了,直接把备份的数据还原即可
案例:
#删除挂载源目录
[root@docker /]# rm -rf html
#再次访问容器找不到页面
[root@k8s-master ~]# curl 172.17.0.2
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
- 迁移
概念:
将原有的volume挂载到新的容器目录
案例:
1.在本地进行数据迁移
#启动容器
docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html nginx
#迁移数据
cp html /data/
#再次启动容器
docker run -d -p 80:80 --name web -v /data/html:/usr/share/nginx/html
2.将数据迁移到远程宿主机
#将数据目录拷贝到远程宿主机
scp -r html root@192.168.12.208:/root/
#启动nginx容器
[root@docker ~]# docker run -d --name web -v ~/html:/usr/share/nginx/html nginx
#测试容器
[root@docker ~]# curl 172.17.0.3
this is a index page
- 销毁
概念:
我们可以删除不再需要的volume
bind mount:
docker不会销毁bind mount,需要由host来进行删除
docker managed volume:
#docker rm : 不会删除容器的volume
#docker rm -v <containerID>: 可以删除容器的volume
#docker volume rm <volumeName>: 删除volume
#docker volume rm $(docker volume ls -q): 批量删除volume
有问题欢迎指正
链接: https://ke.qq.com/course/4300856?tuin=d8aedf68