300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > docker修改容器映射的端口_解密 Docker 挂载文件 宿主机修改后容器里文件没有修改...

docker修改容器映射的端口_解密 Docker 挂载文件 宿主机修改后容器里文件没有修改...

时间:2019-09-16 06:08:37

相关推荐

docker修改容器映射的端口_解密 Docker 挂载文件 宿主机修改后容器里文件没有修改...

问题

使用Docker Volumes时,有时需要挂载一个宿主机目录或者文件,提供数据可持续或者容器内部服务配置文件。

使用命令docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash挂载文件(test.txt 默认权限 644)时,通过vim修改宿主test.txt文件,但是容器中test.txt没有修改。这是为什么?

问题分析

Docker 中,mount volume 的原理是借用了Linux Namespace中的Mount NameSpace,隔离系统中不同进程的挂载点视图,实际文件是没有变化。比如上面的例子,在container中,bash 实际就是一个运行在宿主机上的进程,被Docker用Linux分别隔离了Mount NamespaceUTS NamespaceIPC NamespacePID NamespaceNetwork NamespaceUser Namespace,使得它看上去好像运行在了一个独立的相对隔离的系统上,但实际它的一切资源都是宿主机在不同Namespace中的一个投影,文件也不例外。

为什么宿主机上修改test.txt文件,而容器中test.txt文件没有变化?

Linux中,证明文件是否相同的根本途径是,判断其inode,如果两个文件的inode相同,两个文件必定为同一文件,从而两个文件的内容也必然相同。

验证问题

1、在宿主机上创建一个/root/test.txt文件,使用命令stat查看inode值,如下图:

2、使用命令docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash临时启动一个容器,把宿主机文件/root/test.txt挂载到容器中。

3、另开一个终端,使用vi命令修改 /root/test.txt 文件,编辑完后保存,再次使用 stat 命令查看 /root/test.txt 文件 inode 值。从下图已经发现,inode 值已经改变。

4、登陆容器查看/root/test.txt文件 inode 值。如下图,inode 值还是 vi 修改前的值。而不是修改后的值。这也就解释为什么宿主机上修改了文件而容器中文件没有更新的原因。因为容器与宿主机使用的不是同一个文件。

简述 vi 或者 vim 修改文件过程

Linux 默认情况下,vim为了防止在你修改文件的过程中,由于磁盘或者系统出现问题而导致当前被修改的文件的损坏,它做了类似如下逻辑:

1、复制出一个需要修改文件的副本,命名为在原来文件的基础上增加".swp"后缀以及"."前缀。2、修改内容保存到有.swp后缀的文件,并flush到磁盘3、执行:wq就会交换原文件和swp文件的名称4、删除临时swp文件

从上面可以看出,原来的文件已经被删除,但是容器还是会一直记录以前的文件,只有当restart容器时,容器才会重新读取新的文件。宿主机上修改的内容才会更新。

解决方法

方法一

使用echo修改文件,而不是使用vim或者vi

方法二

修改 vim 配置。执行 vim 命令,输入:scriptnames查看 vim 配置文件路径,这边配置文件路径是/etc/vimrc,在配置文件最后添加如下两行。

setbackup

这样可以解决问题,不过也有一个很大的副作用,那就是每次用vim编辑文件保存之后,vim会生成一个类似该被修改文件,但末尾增加了一个"~"后缀,用以保存修改之前的文件内容。此方法不推荐

方法三

修改文件权限,文件默认权限是644,把权限修改为666。修改完权限后,再次通过 vim 修改并保存后,原文件的 inode 不会发生变化。(推荐此方法)

$ chmod 666 /root/test.txt

方法四

挂载目录,不要挂载文件。挂载目录不会出现宿主机文件更新,而容器中文件没有更新。(推荐此方法)

参考链接

/t/modify-a-file-which-mount-as-a-data-volume-but-it-didnt-change-in-container/2813/13/lylex/p/12781007.html

热门文章推荐

分享Linux内存占用几个案例如何实现rsync多并发同步?我们如何用 K8S 搞定 1000 个应用的测试环境Kubernetes YAML 生成器Kubernetes故障排查指南-分析容器退出状态码IT运维面试问题总结-运维工具、开源应用(Ceph、Docker、Apache、Nginx等)

最后

欢迎您加我微信【ypxiaozhan01】,拉您进技术群,一起交流学习...欢迎您关注【YP小站】,学习互联网最流行的技术,做个专业的技术人...

【文章让您有收获,👇或者在看支持我吧】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。