Docker卷原理

"在此刻要沉醉忘我"


当我们想从宿主机外,控制容器内文件时时行不通的,因为存在Cgroupe、命名空间等虚拟化技术使得容器内的文件对外不可见。所以,引入了卷机制,使得可以从宿主机外访问到容器内的文件内容。

那么,Docker又是如何做到把一个宿主机上的目录、文件,挂载到容器里面去的呢?

------前言

Docker卷机制简介

当容器被创建时,尽管存在、开启了Mount NameSpace,但在其执行chroot之前,都可以看到整个宿主机的文件系统。

chroot: 可以说是最简单和古老的容器化软件之一,可以让您在系统内创建一个独立的环境,使得这个程序不能访问目录之外的其他目录

在宿主机上,也会保存着咱们使用镜像文件。镜像的各个层保存在特定的目录中:

在容器进程启动后,它们还会被联合挂载到特定目录中:

这样整个容器所需的rootfs就准备好了。所以,Volume工作的流程,就是在rootfs准备好后,chroot执行之前,把Volume所指定的宿主机目录,挂载到容器中的目录中。因为在挂载前已经开启了Namespace MOUNT,所以你在宿主机这一层是看不到容器内部的挂载点,从保证了容器的隔离性。

Docker卷机制实战

Linux mount bind

通过mount --bind 命令来将两个目录连接起来。该命令是将前一个目录挂载到后一个目录上,当我们对后一个目录进行访问时,就是对前一个目录的访问 ------ 可以理解为 " 硬链接 "。

  • mount --bind /home /test 会将/home 挂载到/test上
  • 实际上相当于/test的dentry,重定向到了/home的inode
  • 当我们修改/test目录时,实际上就是修改的是/home目录的inode
  • 这就是为何一旦执行umount命令,/test目录原先的内容就会恢复

查看Docker 联合挂载

启动一个容器,并查看挂载的目录:

查看docker inspect容器存储的信息:

执行mount查看一个容器的merged,其实就是upper与lower挂载而成的:

Docker卷深层思考

容器一系列的镜像操作,都是发送在宿主机内部的!由于Mount NameSpace的隔离作用,宿主机压根不知道绑定挂载点的存在。所以,在宿主机看来,容器中挂载点/test目录始终为空的!因为从容器的角度而言,压根操作的不是同一个目录 (不同的Inode),你所有的文件修改都不在这个下。

但对于Docker而言,进行"快照读"(docker commit)时,还是会创建这个/test。只不过,这个/test目录中原有在容器内修改的、创建的文件不复存在,它是一个空目录~

启动容器,挂载文件:

进入容器的挂载宿主机目录,修改index.html:

进入容器查看:

执行docker commit提交为新镜像:

重新启动新镜像,我们只能在这个镜像中看到一个空的目录:

这与我们所预设的恰好对上。


本篇到此结束,感谢你的阅读

祝你好运~

相关推荐
可爱又迷人的反派角色“yang”35 分钟前
ansible剧本编写(三)
linux·网络·云计算·ansible
石像鬼₧魂石6 小时前
内网渗透靶场实操清单(基于 Vulhub+Metasploitable 2)
linux·windows·学习·ubuntu
橘子真甜~7 小时前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
拾贰_C8 小时前
【Linux | Windows | Terminal Command】 Linux---grep | Windows--- findstr
linux·运维·服务器
bloglin999998 小时前
启动容器报错ls: cannot access ‘/docker-entrypoint-initdb.d/‘: Operation not permitted
docker·容器·eureka
songjxin9 小时前
离线部署kubernetes v1.34.3
云原生·容器·kubernetes
阿华hhh9 小时前
Linux系统编程(标准io)
linux·开发语言·c++
石像鬼₧魂石9 小时前
Kali Linux 网络端口深度扫描
linux·运维·网络
alengan9 小时前
linux上面写python3日志服务器
linux·运维·服务器
yBmZlQzJ10 小时前
免费内网穿透-端口转发配置介绍
运维·经验分享·docker·容器·1024程序员节