一、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 绑定 | 移植性强,无需指定目录 |
来源:CSDN
作者:sll2021
链接:https://blog.csdn.net/qq_41977453/article/details/104243668