Docker系列教程05Docker数

北京中科白殿风医院正规吗 https://yyk.39.net/bj/zhuanke/89ac7.html

引言

在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。要想实现数据的持久化,需要将数据从宿主机挂载到容器中。目前Docker提供了三种方式将数据从宿主机挂载到容器中。

Volume普通数据卷,映射到/var/lib/docekr/volumes目录下。

bindmounts绑定数据卷,映射到宿主机指定路径下

tmpfsmounts临时卷,只存在于宿主机内存中

三种方式的示意图如下所示:

一、Volume的基本使用

1、创建数据卷

1、创建一个Volume

[root

qll~]#dockervolumecreatefor_nginxfor_nginx

2、查看所有数据卷

[root

qll~]#dockervolumelsDRIVERVOLUMENAME

localfor_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/htmlnginxcdd81a36e7aba59a63d4a5f7d34ccb2bcade56

mount参数后面跟的是键值对。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]#ls

50x.htmlindex.html

[root

qll_data]#echoHelloworldindex.html

4、测试访问nginx主页

5、验证数据卷的持久化

1、强制删除nginx容器

[root

qll~]#dockerrm-fc2

c2

2、容器被删除,数据卷仍然存在

[root

qll~]#cd/var/lib/docker/volumes/for_nginx/[root

qllfor_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/bashroot

e74393:/#cd/usr/share/nginx/html/root

e74393:/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/bashroot

fad68fbcdab5:/#cd/test

root

fad68fbcdab5:/test#echotmp.txt

root

fad68fbcdab5:/test#cattmp.txt

3、重启容器,发现数据丢失

[root

qll~]#dockerrestartfafa

[root

qll~]#dockerexec-itfa/bin/bashroot

fad68fbcdab5:/#cd/test

root

fad68fbcdab5:/test#cattmp.txt

cat:tmp.txt:Nosuchfileordirectory

4、tmpfsmounts的使用场景

当因为安全或其他原因,不希望将数据持久化到容器或宿主机上,那么可以使用tmpfsmounts模式。

结语

欢迎来到『开源Linux』,这里是Linux爱好者的聚集地。专注分享Linux/Unix相关内容(包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货)。风里雨里,我们在这里等您,期待与您相遇。




转载请注明:http://www.aierlanlan.com/cyrz/3024.html