什么是容器数据卷?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。
特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷三种挂载方式:
- Volumes(卷) :存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上是“ / var / lib / docker / volumes /”)。 非Docker进程不应修改文件系统的这一部分。 卷是在Docker中持久存储数据的最佳方法。 (推荐)
- Bind mounts(绑定挂载) 可以在任何地方 存储在主机系统上。 它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
- tmpfs mounts(临时挂载) 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统。
1、volume(卷)
- 匿名卷使用
docker run -dP -v /etc/nginx nginx
#docker将创建出匿名卷,并保存容器/etc/nginx下面的内容
# -v 容器里的目录
docker run -d -v /usr/share/nginx/html --name=nginx nginx #启动一个容器,匿名挂载
#查看容器内部细节
"Mounts": [
{
"Type": "volume",
"Name": "e361a0689634a84c65fb59c204a5de372586f97e86692bf26368572e37634b58",#卷名,docker自己创建的
"Source": "/var/lib/docker/volumes/e361a0689634a84c65fb59c204a5de372586f97e86692bf26368572e37634b58/_data",#容器数据卷位置
"Destination": "/usr/share/nginx/html",#容器内部挂载目录
"Driver": "local",
"Mode": "",
"RW": true,#是否可写
"Propagation": ""
}
],
- 具名卷使用
docker run -dP -v nginx:/etc/nginx nginx
#docker将创建出名为nginx的卷,并保存容器/etc/nginx下面的内容
如果将空卷装入存在文件或目录的容器中的目录中,则容器中的内容(复制)到该卷中。
如果启动一个容器并指定一个尚不存在的卷,则会创建一个空卷。
docker run -d -P -v nginxhtml:/usr/share/nginx/html --name=nginx777 nginx
# 进入容器内部,可以看到
"Mounts": [
{
"Type": "volume", //这是个卷
"Name": "html", //名字是html
"Source": "/var/lib/docker/volumes/html/_data", //宿主
机的目录。容器里面的哪两个文件都在
"Destination": "/usr/share/nginx/html", //容器内部
"Driver": "local",
"Mode": "z",
"RW": true, //读写模式
"Propagation": ""
}
]
2、bind mount
如果将绑定安装或非空卷安装到存在某些文件或目录的容器中的目录中,则这些文件或目录会被
安装遮盖,就像您将文件保存到Linux主机上的/ mnt中一样,然后 将USB驱动器安装到/ mnt中。
在卸载USB驱动器之前,/ mnt的内容将被USB驱动器的内容遮盖。 被遮盖的文件不会被删除或更
改,但是在安装绑定安装或卷时将无法访问。
总结:外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导
致容器内部是空文件夹
格式如下:
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名
docker run -dP -v /my/nginx:/etc/nginx:ro nginx
#查看容器内部细节
"Mounts": [
{
"Type": "bind",
"Source": "/my/nginx",
"Destination": "/etc/nginx",
"Mode": "ro",
"RW": false,
"Propagation": "rprivate"
}
],
# bind mount和 volumes 的方式写法区别在于
# 所有以/开始的都认为是 bind mount ,不以/开始的都认为是 volumes.
可以使用docker inspect
查看容器绑定的数据卷。
警惕bind mount 方式,文件挂载没有在外部准备好内容而导致的容器启动失败问题
管理卷
可以手动创建卷,然后指定卷名挂载,也可以启动时创建
docker volume create xxx:创建卷名
docker volume inspect xxx:查询卷详情
docker volume ls: 列出所有卷
docker volume prune: 移除无用卷
容器卷权限
如果不写权限默认为rw
权限:
rw
:读写ro
:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取,但是容器内部不能写。
实例:
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data:ro --name=u1 ubuntu
发现主机可以创建文件,而容器内部无法创建
容器卷的继承
即一个容器的共享目录可以被另一个容器继承
# 启动一个容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
即使u1死了,也不影响u2