Docker 深入理解 电脑版发表于:2025/7/10 15:30  >#Docker 深入理解 [TOC] 实践docker隔离机制 ------------ tn2>运行 nginx 镜像,体验隔离机制 ```bash sudo docker run -d nginx:latest sudo docker ps ```  tn2>获取容器在宿主机的进程 Pid ```bash sudo docker inspect --format {{.State.Pid}} 8be42dd180cc ```  tn2>查看宿主机进程详情 ```bash ps -aux | grep 2554 ``` tn2>获取 PID 所有 namespace 类型. ```bash sudo lsns --task 2554 ```  tn2>进入 filesystem namespace,无需 docker daemon ```bash sudo nsenter --target 2554 --mount ``` tn2>查看是否进来了 ```bash ls && whoami ```  tn2>修改容器的主机名,同时会修改宿主机的主机名,这是因为没有进入到utc namespace ```bash hostname my-containers && exit # 到主机后查看名称空间 hostname ```  tn2>进入所有 namespace ```bash sudo nsenter --target 2554 --all ``` tn2>再次修改 hostname,退出后对比宿主机 hostname ,我们发现宿主机的 ```bash hostname my-containers2 && exit hostname ```  深入镜像本质 ------------ tn2>联合文件系统是镜像的基础。 镜像是多层 Layer 的堆叠。 构建时通过叠加新的 Layer 来实现更改。 Layer 在构时会被缓存。 Layer 以 hash 命名。  tn2>两层 Layer,Layer 名称以 Layer 内容的 hash 命名,对Layer.tar 解压之后可见原始文件系统. 第一层 Layer 是基础镜像,第二层是安装nginx 带来的变更(`/usr/sbin`、`/var/www`、`/var/log`)。 层是怎么叠加,如何工作? ### 什么是联合文件系统(Union Filesystem) tn2>联合文件系统(UnionFS)是一种可以将多个目录(通常是不同的文件系统)“联合挂载”为一个统一目录的文件系统类型。它允许多个目录以叠加(Overlay)方式合并,形成一个逻辑上的统一视图。这种机制广泛应用于容器、只读根文件系统、Live CD 等场景中。 优点包括: 分层结构:多个层可以以只读、读写等方式叠加。 节省空间:只读层共享资源,无需重复存储。 灵活性高:支持临时写入层(如tmpfs)等。 ### 动手实践:联合文件系统(Overlay) tn2>OverlayFS 是 Linux 内核原生支持的一种联合文件系统(从 Linux 3.18 起进入主线)。它通过简单高效的机制,将两个目录(上层与下层)合并显示为一个统一的挂载点。 OverlayFS 的两个核心组成部分是: lowerdir(下层目录):只读层,通常是基础镜像等内容。 upperdir(上层目录):读写层,用户的变更、创建文件等都会写入这个目录。 workdir(工作目录):用于 OverlayFS 内部处理的中间数据存储,必须与 upperdir 位于同一文件系统。 合并后挂载点称为 merged(合并层),系统对其进行读写操作,实际操作会根据读写策略分发到 upperdir 或 lowerdir。 接下来我们来做一个实验: ```bash mkdir lower_dir && mkdir upper_dir && mkdir merged_dir && mkdir work_dir echo "" > lower_dir/1.txt echo "" > lower_dir/2.txt echo "" > upper_dir/3.txt echo "" > upper_dir/4.txt echo "This is Lower" > lower_dir/same.txt echo "This is Upper" > upper_dir/same.txt ``` tn2>这里分别创建3个文件到`lower_dir`目录和`upper_dir`目录,其中的`same.txt`写了它们的层级内容,目录结构如下:  tn2>接着我们创建一下OverlayFS ```bash sudo mount -t overlay overlay -o lowerdir=lower_dir,upperdir=upper_dir,workdir=work_dir merged_dir ```  tn2>我们可以看到`lower_dir`和`upper_dir`目录都没有的部分会合并到`merged_dir`目录中。 ```bash cat merged_dir/same.txt ```  tn2>相同到部分`upper_dir`覆盖了`lower_dir`,只保留了`upper_dir`读写层的目录文件。 查看一下挂载情况。 ```bash df -a ```  tn2>接下来我们对`merged_dir`目录中的`1.txt`进行修改添加`gggg`内容,我们来查看一下`lower_dir`和`upper_dir`目录的变化。 ````bash echo "gggg" > merged_dir/1.txt ls lower_dir -al ls upper_dir -al ````  tn2>我们发现只有`upper_dir`目录下的文件进行了修改与添加,`lower_dir`并没有什么变化。 这就是OverlayFS 的核心机制之一,写时复制机制。 接着我们对`merged_dir`目录中的`2.txt`文件进行删除。 ```bash rm merged_dir/2.txt ls lower_dir -al ls upper_dir -al ```  ### 对应关系总结:OverlayFS 与 Docker 的目录结构类比 