一篇文章带你搞懂Docker存储

存储驱动

由storage driver管理的镜像层和可读写层

数据卷

  • 概念 

 Data Volume本质上是Data Host文件系统中的文件或目录,能够被直接mount到容器的文件系统中。

  •  特点

1.Data Volume是目录或文件,而非没有格式化的磁盘

2.容器可以读写Volume中的数据

3.volume数据可以永久保存,即使使用它的容器已经销毁

  •  Volume容量

 因为Volume是docker host文件系统的一部分,所以volume的容量取决于文件系统当前未使用的空间,目前没有办法设置

  •  Data Volume类型

 1.bind mount

2.docker managed volume

Bind Mount

  • 概念

 bind mount是将host上已存在的目录或文件 mount到容器

  •  挂载数据卷

 -v:通过-v参数将host的目录挂载到容器中

格式: -v <host path>:<container path>

     -v ~/html:/usr/share/nginx/html 挂载源:挂载点

  •  案例1(挂载源是目录)

 #会覆盖容器原有的数据

1.更换nginx容器的index.html文件

[root@docker ~]# mkdir html

[root@docker html]# echo "this is a web server" >index.html

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

[root@docker ~]# curl 127.0.0.1

this is a web server

2.更新宿主机文件

 [root@docker html]# echo "this is a index page" >index.html

 [root@docker ~]# curl 127.0.0.1

 this is a index page

3.删除容器

 [root@docker html]# docker rm -f web

 [root@docker ~]# ls

 html

  •  案例2(挂载源是文件)

 #只是修改容器中原有数据目录的某个文件

[root@docker html]# docker run -d -p 80:80 --name web -v ~/html/index.html:/usr/share/nginx/html/index.html nginx

  •  数据读写权限

 1.默认是可读可写

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

2.设置只读权限

 [root@docker html]# docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html:ro  nginx

  • 特性

1.方便数据迁移和备份

2.容器移植性差

 Docker managed volume

  •  概念

 docker managed volume与bind mount的最大区别是不需要指定mount源,指明mount point就可以了

  •  挂载数据卷

 格式: -v

     -v /usr/share/nginx/html

  •  案例

 #启动容器

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

[root@docker ~]# docker inspect web|grep -A 10 -i mounts

       "Mounts": [

           {

               "Type": "volume",

               "Name": "e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f",

               "Source": "/var/lib/docker/volumes/e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f/_data",

               "Destination": "/usr/share/nginx/html",

               "Driver": "local",

               "Mode": "",

               "RW": true,

               "Propagation": ""

           }

[root@docker _data]# ls /var/lib/docker/volumes/e48b3b184307306f449310b3d7604aee2b1754d43d305310a01577e38589e08f/_data

#更新挂载源数据

[root@docker _data]# echo "this is a web server">index.html

  •  查看数据卷

 #docker inspect

[root@docker ~]# docker inspect web

#docker volume

[root@docker ~]# docker volume ls

[root@docker ~]# docker volume inspect 6a80f16365009629a4e99184d377f482b23fb7420002dc536808843834ccbd35

  •  bind mount 和 docker managed volume对比

 1)相同点: 两者都是host文件系统中的某个路径

(2)不同点:

不同点bind mountdocker managed volume
volume位置可任意指定/var/lib/docker/volumes/
对已有挂载点的影响隐藏并替换为volume原有数据复制到volume
是否支持单个文件支持不支持,只能是目录
权限控制可设置为只读,默认为读写权限无控制,均为读写权限
移植性移植性弱,与host path绑定移植性强,无须指定host目录

 容器之间共享数据

 bind mount

 #创建三个容器,将同一个共享目录分别挂载到容器目录里

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

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

[root@docker ~]# docker run -d -p 82:80 --name web3 -v ~/html:/usr/share/nginx/html nginx

#分别测试三个容器

[root@docker ~]# curl 127.0.0.1:80

this is a web server

[root@docker ~]# curl 127.0.0.1:81

this is a web server

[root@docker ~]# curl 127.0.0.1:82

this is a web server

#修改volume中的数据,再次测试

[root@docker html]# echo "this is a index page">index.html

[root@docker html]# curl 127.0.0.1:80

this is a index page

[root@docker html]# curl 127.0.0.1:81

this is a index page

[root@docker html]# curl 127.0.0.1:82

this is a index page

 volume container(数据卷容器)

  •  概念

  volume container是专门为其他容器提供volume的容器,提供的卷可以使bind mount,也可以是docker managed volume。

  •  案例

 1. 使用bind mount创建一个volume container

[root@docker ~]# docker create --name vc_data \

> -v ~/html:/usr/share/nginx/html \

> -v /root/tools:/tools \

> busybox

#查看容器的volume

[root@docker ~]# docker inspect vc_data|grep -A 20 -i "mounts"

#其他容器使用--volumes-from使用这个容器提供的volume

[root@docker ~]# docker run -d -p 80:80 --name web1 --volumes-from vc_data  nginx

[root@docker ~]# docker run -d -p 81:80 --name web2 --volumes-from vc_data  nginx

[root@docker ~]# docker run -d -p 82:80 --name web3 --volumes-from vc_data  nginx

#测试容器

[root@docker ~]# curl 127.0.0.1

this is a index page

[root@docker ~]# curl 127.0.0.1:81

this is a index page

[root@docker ~]# curl 127.0.0.1:82

this is a index page

2. 使用docker managed volume创建一个volume container

[root@docker ~]# docker create --name vc_data \

> -v /usr/share/nginx/html \

> -v /tools \

> busybox

#查看容器的volume

[root@docker ~]# docker inspect vc_data|grep -A 20 -i "mounts"

#其他容器使用--volumes-from使用这个容器提供的volume

[root@docker ~]# docker run -d -p 80:80 --name web1 --volumes-from vc_data  nginx

[root@docker ~]# docker run -d -p 81:80 --name web2 --volumes-from vc_data  nginx

[root@docker ~]# docker run -d -p 82:80 --name web3 --volumes-from vc_data  nginx

#添加index页面到数据卷

#测试容器

[root@docker ~]# curl 127.0.0.1

this is a index page

[root@docker ~]# curl 127.0.0.1:81

this is a index page

[root@docker ~]# curl 127.0.0.1:82

this is a index page

  •  特点

 1.与bind mount相比,不必为每一个容器指定 host path,实现了容器与host的解耦

2.使用volume container的容器,其mount point都是一致的,有利于配置的规范和标准化

 Data volume 生命周期管理

  •  备份

 概念:

对volume的备份实际上就是备份host文件系统中的目录和文件

案例:

#创建容器

docker run -d --name demo -v ~/html:/usr/share/nginx/html nginx

#备份host目录

cp -r html html_bak

  •  恢复

 概念:

数据损坏了,直接把备份的数据还原即可

案例:

#删除挂载源目录

[root@docker /]# rm -rf html

#再次访问容器找不到页面

[root@k8s-master ~]# curl 172.17.0.2

<html>

<head><title>403 Forbidden</title></head>

<body>

<center><h1>403 Forbidden</h1></center>

<hr><center>nginx/1.21.5</center>

</body>

</html>

  •  迁移

 概念:

将原有的volume挂载到新的容器目录

案例:

1.在本地进行数据迁移

#启动容器

docker run -d -p 80:80 --name web -v ~/html:/usr/share/nginx/html  nginx

#迁移数据

cp html /data/

#再次启动容器

docker run -d -p 80:80 --name web -v /data/html:/usr/share/nginx/html

2.将数据迁移到远程宿主机

#将数据目录拷贝到远程宿主机

scp -r html root@192.168.12.208:/root/

#启动nginx容器

[root@docker ~]# docker run -d  --name web -v ~/html:/usr/share/nginx/html  nginx

#测试容器

[root@docker ~]# curl 172.17.0.3

this is a index page

  •  销毁

  概念:

我们可以删除不再需要的volume

  bind mount:

docker不会销毁bind mount,需要由host来进行删除

  docker managed volume:

#docker rm : 不会删除容器的volume

#docker rm -v <containerID>: 可以删除容器的volume

#docker volume rm <volumeName>: 删除volume

#docker volume rm $(docker volume ls -q): 批量删除volume

有问题欢迎指正

链接: ​ ​https://ke.qq.com/course/4300856?tuin=d8aedf68​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值