引言
在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。要想实现数据的持久化,需要将数据从宿主机挂载到容器中。目前Docker提供了三种方式将数据从宿主机挂载到容器中。
Volume普通数据卷,映射到/var/lib/docekr/volumes目录下。
bindmounts绑定数据卷,映射到宿主机指定路径下
tmpfsmounts临时卷,只存在于宿主机内存中
三种方式的示意图如下所示:
一、Volume的基本使用
1、创建数据卷
1、创建一个Volume
[root
qll~]#dockervolumecreatefor_nginxfor_nginx2、查看所有数据卷
[root
qll~]#dockervolumelsDRIVERVOLUMENAMElocalfor_nginx
3、查看指定数据卷详细信息
[root
qll~]#dockervolumeinspectfor_nginx查看数据卷详细信息
可以看到我们创建的for_nginx卷,保存在宿主机/var/lib/docekr/volumes/下;以后针对该Volume的写操作都会保存在/var/lib/docekr/volumes/for_nginx/_data下。
2、挂载数据卷到容器
创建nginx容器,并挂载for_nginx数据卷
[root
qll~]#dockerrun-itd-p88:80--mounttype=volume,source=for_nginx,target=/usr/share/nginx/htmlnginxcdd81a36e7aba59a63d4a5f7d34ccb2bcade56mount参数后面跟的是键值对。source指定宿主机源文件位置。target指定数据卷在容器中的挂载位置。
使用dockerinspect查看容器挂载信息:
红框标出的内容,相信您基本都能看懂,这里扩展一个小知识点:RW:true,表示读写。如果希望数据卷对某个容器来说是只读的,可以通过添加readonly选项来实现,代码示例如下:
dockerrun-itd--mountsource=for_nginx,target=/test,readonlynginx
3、修改nginx主页内容
[root
qll~]#cd/var/lib/docker/volumes/[root
qllvolumes]#cdfor_nginx/_data/[root
qll_data]#ls50x.htmlindex.html
[root
qll_data]#echoHelloworldindex.html4、测试访问nginx主页
5、验证数据卷的持久化
1、强制删除nginx容器
[root
qll~]#dockerrm-fc2c2
2、容器被删除,数据卷仍然存在
[root
qll~]#cd/var/lib/docker/volumes/for_nginx/[rootqllfor_nginx]#more_data/index.htmlHelloworld由此可以验证,容器卷与容器的生命周期无关,在删除容器时,docker不会自动删除卷,即使用Volume可以实现数据的持久化保存。
6、清理卷
如果不再使用本地容器卷,那么可以手动清理掉
[root
qll~]#dockervolumermfor_nginx二、bindmounts的基本使用1、使用卷创建容器
运行一个nginx容器,并将宿主机/webapp目录挂载至容器/usr/share/nginx/html目录:
[root
qll~]#dockerrun-itd-p81:80--mounttype=bind,source=/webapp,target=/usr/share/nginx/htmlnginxe743933fcfd7fda72ce6dcbda61adf58bbe上述命令等同于使用旧的-v参数,代码如下:
dockerrun-itd-p81:80-v/webapp:/usr/share/nginx/htmlnginx
2、验证挂载情况
3、进入容器
[root
qll~]#dockerexec-it/bin/bashroote74393:/#cd/usr/share/nginx/html/roote74393:/usr/share/nginx/html#ls进入该容器,会发现容器该目录本身存在的文件消失不见了。原因如下:
如果你使用Bindmounts挂载宿主机目录到一个容器中的非空目录,那么此容器中的非空目录中的文件会被隐藏,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bindmounts模式和Volumes模式最大的不同。
三、tmpfsmounts的使用
tmpfsmountfs,顾名思义是一种非持久化的数据存储。它仅仅将数据保存在宿主机的内存中,一旦容器停止运行,tmpfsmounts会被移除,从而造成数据丢失。
1、运行一个容器,并指定临时卷
[root
qll~]#dockerrun-itd--mounttype=tmpfs,target=/testubuntu:18.04fad68fbcdabfad03db7fa1e4f40c4efb8a30dcaf38dc3efdb[root
qll~]#2、在容器中写入数据[root
qll~]#dockerexec-itfa/bin/bashrootfad68fbcdab5:/#cd/testroot
fad68fbcdab5:/test#echotmp.txtroot
fad68fbcdab5:/test#cattmp.txt3、重启容器,发现数据丢失
[root
qll~]#dockerrestartfafa[root
qll~]#dockerexec-itfa/bin/bashrootfad68fbcdab5:/#cd/testroot
fad68fbcdab5:/test#cattmp.txtcat:tmp.txt:Nosuchfileordirectory
4、tmpfsmounts的使用场景
当因为安全或其他原因,不希望将数据持久化到容器或宿主机上,那么可以使用tmpfsmounts模式。
结语
欢迎来到『开源Linux』,这里是Linux爱好者的聚集地。专注分享Linux/Unix相关内容(包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货)。风里雨里,我们在这里等您,期待与您相遇。