Docker 容器数据卷

123 阅读3分钟

容器数据卷

容器数据卷是什么?

卷就是目录或者文件,存在一个或者多个容器中,由 Docker 挂载到容器,但是不属于联合文件系统,数据卷设计的目就是数据的持久化存储,完全独立于容器的生命周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。

容器数据卷的特征:

  1. 数据卷可以在容器之间共享或者重用数据
  2. 容器和宿主机之间数据共享
  3. 卷中的更改可以直接实时生效
  4. 数据卷中的更改不会包含在镜像的更新中
  5. 数据卷的生命周期一直持续到没有容器使用他们为止

为容器添加数据卷:

docker run -it --pervileged=true -v /宿主机绝对路径目录:/容器内目录  镜像名
# 选项解释
--privileged=true  的作用是允许目录挂载
-v 是挂载硬盘

Docker 挂载目录访问的时候如果出现 cannot open directory : Permission denied 解决办法就是在挂载目录后多加一个 --privileged=true 参数即可
在进行容器数据卷挂载的时候如果如果容器中的目录不存在的话Docker 会自动创建,但是如果实在宿主机的目录不存在的时候挂载命令就会报错提示

查看容器的数据卷是否挂载成功

命令:docker inspect 容器ID

image.png
其中 Source 是宿主机的目录,Destination 是容器内的目录

容器数据卷和主机互通互联

  1. docker 修改,主机同步获得
  2. 主机修改 ,docker 同步获得
  3. docker 容器stop ,主机修改,docker 容器重启数据仍能同步

数据卷的读写规则

ro 即 read only ,容器只能读;rw 即 write only 容器只能写

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro --name:容器名 镜像名

容器卷之间的继承

docker run -it  --privileged=true --volumes-from 父类(名称)  --name:容器名 镜像名

具名挂载和匿名挂载

docker volume ls 查看所有数据卷的情况

匿名挂载

docker run -d -P --name=nginxt01 -v /etc/nginx nginx

使用docker volume ls 查看:

image.png 这里84开头的那一长串就是挂载到宿主机的名字。 我们继续追查下去。这里教给大家一个很简单的命令,less。如果输出的信息太多了,我们找不到,就可以这样使用 cmd | less 栗子: docker inspect 84(容器ID) | less 然后输入/name, name是你想查到的内容,就可以很轻松的找到啦。 大家仔细看一下,是不是/etc/nginx就是叫84开头的那一长串,挂载到了我/var/lib…路径下,我们复制这个路径继续去查看。 image.png 怎么样,是不是在我们的宿主机就发现了这样的一个文件呢?这就是所谓的匿名挂载!是不是很简单 image.png

具名挂载

我们使用具名挂载的方式启动一个容器

docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx

查看数据卷:docker volume ls image.png docker inspect ID | less 找到挂载点

image.png 我们再复制一下路径,找到nginx的配置文件

image.png

如何确定是具名挂载还是匿名挂载:
-v  容器内路径               #匿名挂在
-v  卷名:容器内路径          #具名挂在
-v  /宿主机路径:容器内路径    # 指定路径挂载

Tips:

通过 -v 容器内路径  :ro   rw   可以改变读写权限
ro  readonly   #只读
rw  readwrite  #可写可读
例: docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx
    docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx