docker常用命令之volume怎么使用

免费教程   2024年05月10日 15:00  

这篇文章主要讲解了“docker常用命令之volume怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“docker常用命令之volume怎么使用”吧!

1、 volume方式

在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。

目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

由上图可以知道,目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

注意:如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将container中的目录覆盖。

(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)

bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。

这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

有几点需要注意:

1、host机器的目录路径必须为全路径(准确的说需要以/或~/开始的路径),不然docker会将其当做volume而不是路径来处理

2、如果host机器上的目录不存在,docker会自动创建该目录

3、如果container中的目录不存在,docker会自动创建该目录

4、如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉

(3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)

2、Volume的基本使用2.1 管理卷#dockervolumecreateedc-nginx-vol//创建一个自定义容器卷#dockervolumels//查看所有容器卷#dockervolumeinspectedc-nginx-vol//查看指定容器卷详情信息

例如,这里我们创建一个自定义的容器卷,名为"edc-nginx-vol":

2.2 创建使用指定卷的容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:

#dockerrun-d-it--name=edc-nginx-p8800:80-vedc-nginx-vol:/usr/share/nginx/htmlnginx

其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到/usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

创建好容器之后,我们可以进入容器里面看看:

可以看到有两个默认页,这时我们新启动一个SSH连接到宿主机去到刚刚创建的数据卷里边看看:

可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。

在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。

这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。

由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。

此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

2.3 清理卷

如果不再使用自定义数据卷了,那么可以手动清理掉:

#dockerstopedc-nginx//暂停容器实例#dockerrmedc-nginx//移除容器实例#dockervolumermedc-nginx-vol//删除自定义数据卷3、Bind Mounts的基本使用3.1 使用卷创建一个容器dockerrun-d-it--name=edc-nginx-v/app/wwwroot:/usr/share/nginx/htmlnginx

这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

这时我们再次进入容器内部看看:

可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。

但是,我们可以将宿主机上的文件随时挂载到容器中:

Step1.新建一个index.html

  

Step2.在容器中查看

3.2 验证绑定dockerinspectedc-nginx

通过上述命令可以看到一大波配置,我们要关注的是:

3.3 清理dockerstopedc-nginxdockerrmedc-nginx

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

3.4 应用案例

在服务治理组件中,服务发现组件是一个最常用的组件之一,Consul是一个流行的服务发现开源项目,Consul推荐我们使用配置文件的方式注册服务信息。

因此,我们常常会将填写好服务注册配置文件放在宿主机的一个文件目录下将其挂载到Consul的容器指定目录下,如下所示:

dockerrun-d-p8500:8500--restart=always\-v/XiLife/consul/data/server1:/consul/data-v/XiLife/consul/conf/server1:/consul/config\-eCONSUL_BIND_INTERFACE='eth0'--privileged=true\--name=consul_server_1consul:1.4.4agent-server-bootstrap-expect=3-ui-node=consul_server_1-client='0.0.0.0'\-data-dir/consul/data-config-dir/consul/config-datacenter=xdp_dc;

可以看到,我们通过Bind Mounts的方式将宿主机上的/XiLife/consul/data/server1目录挂载到了容器的/consul/data目录下,还将/XiLife/consul/conf/server1目录挂载到了容器的/consul/config目录下,而容器下的两个目录/consul/data和/consul/config则是我们指定的存放agent数据和配置文件的地方。

因此,宿主机上的配置文件的变化会及时反映到容器中,比如我们在宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:

dockerexecconsul-serverconsulreload

这里的consul-server是容器的名字,consul reload是重新加载的命令(非restart)。

4、移除未使用的数据卷[root@izoq008ryseuupz_data]#dockervolumelsDRIVERVOLUMENAMElocal3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62flocal5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24dlocal6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958local8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22local08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127local31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7alocal208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8local3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ealocala4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077alocalc8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4localcentos-volumelocaldb153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155localdcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489clocalf00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369[root@izoq008ryseuupz_data]#[root@izoq008ryseuupz_data]#dockervolumepruneWARNING!Thiswillremovealllocalvolumesnotusedbyatleastonecontainer.Areyousureyouwanttocontinue?[y/N]yDeletedVolumes:31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c83c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62fdb153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22centos-08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114eaTotalreclaimedspace:94.79MB[root@izoq008ryseuupz_data]#dockervolumelsDRIVERVOLUMENAMElocal6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958localc8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a45、根据volume查询容器id[root@ipsenuatmdm]#dockerps-q|xargsdockerinspect--format'{{.State.Pid}},{{.Id}},{{.Mounts}}'|grep016b3bd621cf4aea76e91a496c4affae9e5a99c4ceca160465863c87fd6e0c78##或者[root@ipsenuatmdm]#dockerinspect$(dockerps-q)--format'{{.State.Pid}},{{.Id}},{{.Mounts}}'|grep016b3bd621cf4aea76e91a496c4affae9e5a99c4ceca160465863c87fd6e0c78

感谢各位的阅读,以上就是“docker常用命令之volume怎么使用”的内容了,经过本文的学习后,相信大家对docker常用命令之volume怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部