为何Docker容器在宿主机挂载目录被删除后仍可写入挂载卷?
容器挂载目录被删除后仍可写入的原因
这本质是Linux文件系统的inode机制和挂载特性导致的,并非容器独有的现象,核心逻辑如下:
挂载关联的是inode而非路径:当你将宿主机目录挂载到容器内时,容器的挂载点实际指向的是宿主机目录对应的inode(文件系统中唯一标识文件/目录的元数据节点),而非表面的路径字符串。宿主机删除原目录,只是移除了路径到inode的映射关系(目录项),但只要inode还被挂载引用着(容器的挂载关系未解除),这个inode就不会被系统回收,容器内进程依然能通过挂载点访问到该inode对应的文件系统空间。
进程的文件描述符独立于路径:如果容器内进程已经打开了挂载目录下的文件,或者当前工作目录处于挂载点下,进程会持有对应的文件描述符,这些描述符直接关联inode,和路径无关。即便宿主机删除原目录,进程依然可以通过文件描述符读写现有文件,甚至创建新文件——新文件会写入到该inode对应的存储空间,只是宿主机上暂时没有对应的路径可以访问,直到挂载关系解除后inode才会被回收。
挂载关系的生命周期不受原路径影响:容器的挂载操作在宿主机的挂载命名空间中完成,一旦挂载成功,挂载点的有效性不依赖于原宿主机目录的存在。只要容器未卸载该挂载或未停止,挂载关系就会持续存在,容器内的挂载点始终能正常读写。
内容的提问来源于stack exchange,提问作者Thomas Bratt
相关产品推荐
相关产品推荐

