Docker容器数据卷
1.容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统(不属于容器内),因此能够绕过联合文件系统,提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时,删除其挂载的容器卷。
简而言之就是将docker容器内的数据保存进宿主机的磁盘中,并可以实现主机写,容器知道。容器写,主机知道,互通有无,互读互写。
特点:
- 容器卷可以在容器之间共享或重用数据。
- 卷中的更改可以实时生效。
- 数据卷中的更改不会包含在容器的更新中。
- 数据卷的生命周期一直到没有容器使用它为止。
2.数据卷的使用
1.添加数据卷
命令
docker run -it -v /宿主机内绝对路径:/容器内目录 镜像名(默认可读可写)
可以绑定挂载多个,就像一台电脑可以连接多个U盘
docker run -it \
-v /宿主机内绝对路径:/容器内目录 \
-v /宿主机内绝对路径:/容器内目录 \
image
如果提示Permission denied
错误,追加--privileged=true
在后面即可
原因:CentOS7的安全模块会比之前版本的系统有所增强,不安全的会先禁止,所以目录挂载的情况被默认为是不安全的行为,在SELinux里面挂载目录被禁止了,如果要开启,一般用--privileged=true
命令,扩大容器的权限解决挂载目录没有权限的问题,使用该参数,容器内才真正拥有root权限,否则,容器内的root只是外部的一个普通用户权限。
docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录 镜像名
2.查看是否关联成功
docker inspect 容器ID
会以json串形式打印显示所有容器内细节,找到Mounts
节点了解容器数据卷的挂载情况。
"Mounts": [
{
"Type": "volume",
"Name": "portainer_data",
"Source": "/var/lib/docker/volumes/portainer_data/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
},
{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Destination": "/var/run/docker.sock",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
3.限制只读
默认情况数据卷是可读可写的,但是有时出于对数据的保护,需要容器内只能读不能写,如果宿主机写入了内容,会同步给容器,只会限制容器,不限制宿主机,容器内强行写,会报错Read-Only file system
做法: 命令上追加 ro
: read only
docker run -it --privileged=true -v /宿主机内绝对路径:/容器内目录:ro 镜像名
3.数据卷的继承和共享
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,称为数据卷容器。
数据卷的生命周期一直到没有容器使用为止,挂载数据卷后被继承的父容器,即使被停止,继承的子容器也会保持数据卷和宿主机的关联,也就是说子容器只是继承了父容器文件映射的规则而已。
docker run -it --name 容器名 --volumes-from 父容器名 镜像