docker数据卷(8)

て烟熏妆下的殇ゞ 提交于 2020-02-12 19:32:39

一、docker数据卷管理

1.为什么用数据卷?
docker分层文件系统

  • 性能差
  • 生命周期与容器相同

2.docker数据卷

  • mount 到主机中,绕开分层文件系统
  • 和主机磁盘性能相同,容器删除后依然保留
  • 仅限本地磁盘,不能随容器迁移
    3.docker提供了两种卷:
  • bind mount
  • docker managed volume

1. bind mount

bind mount 是将主机上的目录或文件mount到容器里,使用直观高效,易于理解。使用-v选项指定路径,格式:

[root@node2 ~]# docker run -d --name web1 -p 80:80 -v /opt/website:/usr/share/nginx/html nginx
f54e513e868034a773637018214a6c98a4ca70eb30e994ce067a87677adfa5cb
[root@node2 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f54e513e8680        nginx               "nginx -g 'daemon of…"   9 seconds ago       Up 7 seconds        0.0.0.0:80->80/tcp   web1

为啥curl的时候是禁止。是因为这个目录是空的,找不到默认页面。
在这里插入图片描述在这里插入图片描述想要进容器里,得在命令行输入一个bash,否则,通过attach 进去容器后,在退出,进程会结束掉。
在这里插入图片描述
在这里插入图片描述以bash的方式进:

[root@node2 website]# docker exec -it web1 bash

退出的是bash。
在这里插入图片描述
绑定挂接这种方式会以宿主机的路径为主,容器内原有数据会被替换掉。
bind mount默认权限是读写rw,可以在挂载时指定只读ro。

  • -v 选项指定的路径,如果不存在,挂载时会自动创建。
    在这里插入图片描述也可以把yum源作为文件来挂载,
    在这里插入图片描述对于这种文件最好是只读挂载,防止乱修改。

二、docker managed volume

  • bind mount 必须指定host文件系统路径,限制了移植性。
  • docker managed volume 不需要指定mount 源,docker自动为容器创建数据卷目录。
  • 默认创建的数据卷目录都在/var/lib/docker/volumes中。
  • 如果挂载时指向容器已有的目录,原有数据会被复制到volumes中。
[root@node2 ~]# docker run -d --name web1 -v /usr/share/nginx/html nginx
7466c8e0d1d8cbd04e212868765030961eb2cedd6283f7565e33547d5ba95843
[root@node2 ~]# docker inspect web1

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

[root@node2 ~]# cd /var/lib/docker/volumes/80a79a388ea10de4ff0f609882f4f4ef9aee313bf69f3b8556ab9ff188f89394/_data 
[root@node2 _data]# ls  #docker manage volume 创建的数据卷不会覆盖原来容器里的内容。
50x.html  index.html

随机创建的目录太长,也可以指定数据卷的名字:

[root@node2 ~]# docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
d32350953eb265cba9a0ddb2d03c0d163c23448deeb5f61e1dd4e78b1e2c7d6d 

在这里插入图片描述

[root@node2 ~]# docker inspect web2

在这里插入图片描述

[root@node2 ~]# cd /var/lib/docker/volumes/website2/_data  #website2是指定的目录
[root@node2 _data]# echo hahaha > index.html
[root@node2 _data]# curl localhost
hahaha

把运行的容器删除后,逻辑卷依然存在:
在这里插入图片描述逻辑卷需要手工删除:docker volume prume #删除不被容器使用的逻辑卷

[root@node2 ~]# docker volume create webdata
webdata
[root@node2 ~]# docker volume ls
DRIVER              VOLUME NAME
local               webdata
[root@node2 ~]# docker run -d --name web1 -p 80:80 -v webdata:/usr/share/nginx/html/ nginx
04d11f164d1e59042a20efab83574df19b5b32ffa3c84d479b12d75c96e47048
[root@node2 ~]# cd /var/lib/docker/volumes/webdata/_data/
[root@node2 _data]# ls
50x.html  index.htm
[root@node2 _data]# ls
[root@node2 _data]# echo xixi > index.html
[root@node2 _data]# curl localhost
xixi

在这里插入图片描述
在这里插入图片描述bind mount 与 docker managed volume 对比

  • 相同点:两者都是host文件系统中的某个路径。
  • 不同点:
bind mount docker managed volume
volume位置 可任意指定 /var/lib/docker/volume/…
对已有mount point 影响 隐藏并替换为volume 原有数据复制到volume
是否支持单个文件 支持 不支持,只能是目录
权限控制 可设为只读,默认读写权限 无控制,均为读写权限
移植性 移植性弱,与host path 绑定 移植性强,无需指定目录
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!