Docker(五)数据卷Volume
Docker内的文件系统是如何工作?
Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重启时,之前的修改将会丢失。在Docker中,只读层和顶部的读写层的组合被称为联合文件系统(Union File System)。
Docker镜像可以理解成多个只读文件叠加而成,因此镜像是只读的,当镜像运行起来时就相当于在只读的镜像外包裹了一层读写层变成了容器。
当删除容器之后,使用镜像重新创建一个容器时,此时的镜像的只读层和原来一样,只是在读写层的修改会全部丢失。
为什么要使用数据卷Volume?
Docker的数据卷Volume能让容器从宿主机中读取文件或持久化数据到宿主机主机内,让容器与容器产生的数据分离开来。可以简单的把Volume理解为Linux服务器上的挂载点。一个容器可以挂载多个不同的目录。Volume的生命周期是独立于容器的生命周期之外的,即使容器删除Volume也会保留下来,Docker也不会因为这个Volume没有被容器使用而回收。在容器中,添加或修改这个文件夹中的文件也不会影响容器的联合文件系统。
Volume数据卷不使用分层文件系统,这对经常读取和写入的数据很有用。在开发过程中,可以将代码目录挂载到容器中,这样如果更改代码容器会实时地得到文件修改的返回。容器中的挂载点必须是绝对路径,不支持相对路径。宿主机上的地址可以是 一个绝对路径,也可以是一个数据卷名称。如果数据卷不存在,Docker会自动创建数据卷。注意不要在Dockerfile中指定挂载一个主机的目录,这样做不够灵活,因为在其它主机上不一定会存在这样的目录。
数据卷的特性
• 数据卷 可以在容器之间共享和重用
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷 默认会一直存在,即使容器被删除
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷 默认会一直存在,即使容器被删除
bind 和volume的区别
bind方式直接挂载 注意:如果源文件不存在或者挂载的目录在容器中非空目录 则该目录现有的内容将被隐藏。例如挂载到nginx访问目录 原有的index.html 50x.html 将被隐藏
volume方式 如果容器镜像中挂载的目录有文件,则文件会显示
volume相关指令操作
Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes
挂载方式
1.Dockerfile直接挂载
参照 Docker 镜像管理
VOLUME ["/opt/logs"]
生成的挂载目录默认在 /var/lib/docker/volumes/{VOLUME_NAME}/_data/ 下
root@ryj-dev10:/home/wuh151# cd /var/lib/docker/volumes/ root@ryj-dev10:/var/lib/docker/volumes# ll total 48 drwx------ 4 root root 4096 Dec 31 17:30 ./ drwx--x--x 14 root root 4096 Nov 3 15:58 ../ drwxr-xr-x 3 root root 4096 Dec 30 15:03 047d574f70c4721def2c3f5342acc3589308c6f1cf93620175fc7f982e87b262/ root@ryj-dev10:/var/lib/docker/volumes# cd 047d574f70c4721def2c3f5342acc3589308c6f1cf93620175fc7f982e87b262/_data/ root@ryj-dev10:/var/lib/docker/volumes/047d574f70c4721def2c3f5342acc3589308c6f1cf93620175fc7f982e87b262/_data# ls debug.log debug.log.20201230.0.log error.log info.log info.log.20201230.0.log warn.log
2.docker container run挂载
docker container run -d -p=11001:11001 --name=uupm-api --privileged=true -v /opt/test/ryj/:/opt harbor.lingda.com/uupm/uupm-api:2.0 sh
挂载目录查询
docker inspect {CONTAINER_ID}
...
"Mounts": [
{
"Type": "bind",
"Source": "/opt/test/ryj",
"Destination": "/opt/ryj",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
...