本文主要是介绍Docker:认识Docker Managed Volumes管理卷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 什么是存储卷
- 为什么需要存储卷?
- 数据丢失问题
- 性能问题
- 容器和宿主机访问不方便
- 容器和容器共享不方便
- 存储卷类型
- volume docker管理卷
- bind mount绑定数据卷
- tmpfs mount临时数据卷
- 管理卷
- 创建卷
- 1. 使用volume命令创建
- docker volume create
- docker volume inspect
- docker volume ls
- docker volume prune
- docker volume rm
- 2. 使用-v或者是--mount来进行制定信息
- 3. Dockerfile匿名卷
- 具体操作
- Docker管理卷共享
什么是存储卷
存储卷就是把宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系,这就意味着,当在容器的这个目录下写入数据时,容器会直接把内容写入到宿主机的目录下,形成一个绑定关系
在宿主机上的这个与容器形成绑定关系的目录就被叫做是存储卷,卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或者目录的形式存储在宿主机上
比如,宿主机的/data/web目录和容器中的/data/web目录建立绑定关系,那么容器中的进程向这个目录进行数据写入的时候,就是直接写在宿主机的目录上的,绕过了容器文件系统与宿主机文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,可以让容器直接访问宿主机的内容,也可以宿主机向容器写入内容,宿主机和容器数据读写是同步的
为什么需要存储卷?
数据丢失问题
容器按照业务进行分类,大体可以分为:
- 无状态
- 有状态
所谓状态,其实就是需不需要被持久化,而容器更加适用于进行无状态应用,因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于读写层,当容器被删除时,容器中的读写层就会随之消失
而容器是希望,业务可以保持无状态的,可以做到开箱即用,并且可以任意调度,但是实际上,业务总是需要有持久化的情况出现,比如有MySQL这样的情况,那为了解决有状态业务的问题,就引入了卷的概念
性能问题
联合文件系统在进行修改删除的效率很低,而不得不承认有些场景是需要进行IO密集型,例如Redis的持久化,对于底层存储的性能要求就很高,因此要有卷
容器和宿主机访问不方便
在前面的命令中可以看到,实际上宿主机和容器的相互访问要借助Docker中的docker cp命令,其实还是有点麻烦的
容器和容器共享不方便
存储卷类型
就目前而言,Docker提供了三种方式,来把数据从宿主机挂载到容器当中
volume docker管理卷
默认映射到宿主机上的/var/lib/docker/volumes目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是会由容器引擎自己创建的一个空的目录,或者是一个已经存在的目录,与存储卷建立一个存储关系,缺点是,用户不能指定那些使用目录,这个适合于进行临时存储
bind mount绑定数据卷
映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个指定的路径,在容器中也要指定一个特定的路径,建立一个映射关系
tmpfs mount临时数据卷
映射到宿主机的内存中,一旦容器停止运行,tmpfs mounts就会被移除,数据就会消失,适合于高性能的临时数据存储
管理卷
创建卷
存储卷可以通过命令的方式进行创建,也可以在创建容器的时候通过-v选项或者是–mount选项来进行指定
1. 使用volume命令创建
docker volume create
功能:创建存储卷
docker volume inspect
功能:显示存储卷的详细信息
docker volume ls
功能:列出所有的存储卷
docker volume prune
清理没有用的数据卷
docker volume rm
删除卷,如果某个卷在使用中是不可以被删除的
2. 使用-v或者是–mount来进行制定信息
对于-v选项来说,基本用法如下所示:
docker run -v name:dictory[:options]...
对于上述命令的参数来说,第一个参数表示的是卷的名称,第二个参数表示的是卷映射到容器的目录,第三个参数表示的是选项,比如说有ro,表示的是read only
样例:
执行下面的命令,创建一个容器:
root@VM-24-7-ubuntu:~# docker run -d --name mynginx -v myvol:/app nginx
97e3937c1def0d36d36bda2e4379ca3a8ca2b99adf3ad0cc0871ec5cfdd57f41
上述的命令表示的意思是,以后台运行一个容器,把这个容器的名字命名为mynginx,然后指定一个卷,这个卷的名字是myvol,把这个卷映射到/app这个目录下,使用的是nginx的镜像,这个镜像使用的版本是最后的版本内容
下面运行命令去查看容器的具体信息如下:
"Mounts": [{"Type": "volume","Name": "myvol","Source": "/var/lib/docker/volumes/myvol/_data","Destination": "/app","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]
下面介绍的是–mount参数
功能是完成目录映射
语法体现为:
--mount '<key>=<value>,<key>=<value>'
其中比较重要的参数有:
- type:指定对应的类型,比如说有bind, volume,或者是tmpfs
- source,src:对于命名卷来说,这个参数表示的意思是卷的名称,对于匿名卷来说就会选择忽略这个字段
- destination:表示的是文件或者是目录挂载到容器中的路径
- ro:表示的是read only只读等
样例体现如下:
使用mount来进行volume的创建
root@VM-24-7-ubuntu:~# docker run -d --name mynginx --mount source=myvol,target=/app nginx
19efb10eaffb513314070d1bb9d1321435ed652b199803bb898d0cab5139128f
对于上述创建出的容器来说,创建的存储卷的方式是使用了–mount的方式进行创建,在进行创建的时候是使用的键值对这样的方式,指定了source表示的是命名卷,把这个存储卷的名字命名为myvol,同时把target,也就是文件挂载的路径制定在了/app上
3. Dockerfile匿名卷
通过Dockerfile也能创建出一个docker管理卷,这个在进行后续的Dockerfile的内容中进行解释
具体操作
下面使用例子来具体的演示出,是如何使用命令进行Docker volume的创建的
命令创建管理卷
root@VM-24-7-ubuntu:~# docker volume create myvol
myvol
root@VM-24-7-ubuntu:~# docker container run --name mynginx -d -p 80:80 -v myvol:/usr/share/nginx/html nginx
feea94668b4f57b90e726387b1ef7953d75695051c9a928f2420245a544cab8b
这样就创建好了一个管理卷
查看Docker的管理卷
root@VM-24-7-ubuntu:~# docker volume ls
DRIVER VOLUME NAME
local myvol
root@VM-24-7-ubuntu:~# docker volume inspect myvol
[{"CreatedAt": "2024-06-10T15:44:06+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/myvol/_data","Name": "myvol","Options": null,"Scope": "local"}
]
现在进入到这个目录中,就可以向这个目录中存放内容了
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# echo hello docker volume > index.html
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# cat index.html
hello docker volume
现在访问主页,其实就能访问到容器中的nginx界面了:
因此就能看出的是,宿主机的内容和容器中的内容是同步的
删除容器
root@VM-24-7-ubuntu:~# docker rm -f mynginx
mynginx
现在容器被删除了,但是卷还没删除:
root@VM-24-7-ubuntu:~# cd /var/lib/docker/volumes/myvol/_data
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls
50x.html index.html
那卷怎么删除呢?需要把卷也删除:
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# docker volume rm myvol
myvol
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls /var/lib/docker/volumes/myvol/_data
ls: cannot access '/var/lib/docker/volumes/myvol/_data': No such file or directory
此时再进行查看,就能看到对应的内容已经不存在了
由此也能看出,卷的生命周期和容器是不同步的,是需要单独把卷进行删除的
Docker管理卷共享
现在我们创建两个容器,共享一个卷
root@VM-24-7-ubuntu:~# docker container run --name nginx1 -d -p 80:80 -v myvol:/usr/share/nginx/html nginx
8c3359496860befb845513d7cb59547bc5e5239991f1ff22b9efe58a3530fae9
root@VM-24-7-ubuntu:~# docker container run --name nginx2 -d -p 8088:80 -v myvol:/usr/share/nginx/html nginx
6cc9e8b6e3705647c815a93ef26b8ce5ef7d19779918f0df870f319064aad615
进入宿主机中进行合适的修改
root@VM-24-7-ubuntu:~# docker volume inspect myvol
[{"CreatedAt": "2024-06-10T16:15:56+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/myvol/_data","Name": "myvol","Options": null,"Scope": "local"}
]
root@VM-24-7-ubuntu:~# cd /var/lib/docker/volumes/myvol/_data
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls
50x.html index.html
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# echo hello docker volume share > index.html
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# cat index.html
hello docker volume share
此时进行查看,会发现这两个端口访问到的容器是一样的
这篇关于Docker:认识Docker Managed Volumes管理卷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!