当我们把应用和环境 打包成一个镜像。
并且以这个镜像 运行产生一个容器时,当这个容器被删除,容器中的数据也随之被删除。
于是便产生了需求:容器中的数据持久化。
容器之间 有一个数据共享技术,将docker 中产生的 数据 同步到本地。
这就是 卷技术,将容器的内目录挂载到 本地,也就是Linux 服务器上。
容器的持久化操作和同步操作,容器之间可以数据共享。
1:使用命令直接挂载
docker run -it -v 主机目录:容器目录内
可以 使用 docker inspect 容器Id 查看是否挂载成功
此时已经挂载成功
“Mounts”: [ #-v 数据卷挂载
{
“Type”: “bind”,
“Source”: “/home/test”, #主机内地址
“Destination”: “/home”, #容器内地址
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
],
当 我们在 容器内创建了一个 testzrx.java 的文件时,文件被同步到了 Linux系统文件目录下。
同步的过程 类似与 双向绑定机制。
当容器停止 时,只要容器还存在,修改容器中挂载的 卷 的内容 也会被同步到 本地的Linux 系统文件目录下。
好处:当我们在本地修改文件的 时候,会自动的去修改容器中的文件。
#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01-v /ect/nginx nginx
查看所有的 数据卷
docker volume ls
DRIVER VOLUME NAME
local 471b9f8e6cda5caf945e7420ba6434dd71432c5e05c787ed128ccb38e5cdc731(匿名)
local c5ed47ea84c7ccb620d97a2cfecdcfb8944720526afc7295e5bb26023dada859(匿名)
这种数据都是匿名挂载的,因为 我们在 -v 挂载数据卷的时候 没有指定 容器外的路径
#具名挂载
docker -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx nginx
DRIVER VOLUME NAME
local 471b9f8e6cda5caf945e7420ba6434dd71432c5e05c787ed128ccb38e5cdc731
local c5ed47ea84c7ccb620d97a2cfecdcfb8944720526afc7295e5bb26023dada859
local juming-nginx(具名挂载)
查看卷的具体位置
docker volume inspect 卷名
所有为指定具体位置的卷 都会在 /var/lib/docker/volumes/xxxx 下的位置。
//平时使用的时候 尽量使用 指定路径挂载和 具名挂载,
-v /容器内路径 匿名挂载
-v 卷名:/容器内路径 具名挂载
-v /宿主机路径:/容器内路径 指定路径挂载
数据卷权限:
-v 容器内路径:ro Readonly 只读
-v 容器内路径:rw Readwrite 可读可写
默认是可读可写
#一但设置了容器权限,我们挂载出来的内容 就是有限定 的
docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx:ro nginx #只读
docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx:rw nginx #可读可写
#如果设置是ro(只读)的话,这个路径就只能通过宿主机操作,容器内部 是无法操作的。