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提交为新镜像:

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

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


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

祝你好运~

相关推荐
码割机8 分钟前
Linux服务器安装jdk和maven详解
java·linux·maven
亚林瓜子24 分钟前
在amazon linux 2023上面源码手动安装tesseract5.5.1
linux·运维·服务器·ocr·aws·ec2
爱学习的大牛12326 分钟前
Ubuntu 24.04 安装 FreeSWITCH 完整教程
linux·freeswitch
go_bai33 分钟前
Linux--进程池
linux·c++·经验分享·笔记·学习方法
人工智能训练1 小时前
在ubuntu系统中如何将docker安装在指定目录
linux·运维·服务器·人工智能·ubuntu·docker·ai编程
Lisonseekpan1 小时前
Linux 常用命令详解与使用规则
linux·服务器·后端
青木川崎1 小时前
linux面试题
java·linux·运维
爱宇阳1 小时前
Java Spring Boot 项目 Docker 容器化部署教程
java·spring boot·docker
掘根1 小时前
【Docker】网络
网络·docker·容器
洋芋土豆2 小时前
linux文件及目录管理和vim编辑
linux·vim