docker的联合文件系统(UnionFS)

2023-11-17

docker最大的贡献就是定义了容器镜像的分层的存储格式,docker镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。

联合挂载系统的工作原理:读:如果文件在upperdir(容器)层,直接读取文件;如果文件不在upperdir(容器)层,则从镜像层(lowerdir)读取。

目前docker支持的联合文件系统有很多种,包括:AUFS、overlay、overlay2、DeviceMapper、VSF等。

Linux 中各发行版实现的 UnionFS 各不相同,所以docker在不同 linux 发行版中使用的也不同。通过docker info 命令可以查看当前系统所使用哪种 UnionFS,常见的几种发行版使用如下:

CentOS, Storage Driver: overlay2、overlay,devicemapper
debain, Storage Driver: aufs 
RedHat, Storage Driver: devicemapper,overlay2

查看docker容器使用的文件系统使用的命令如下,其中Storage Driver: overlay2代表使用的是overlay2联合文件系统。

[root@master01 diff]# docker info
Containers: 27
 Running: 18
 Paused: 0
 Stopped: 9
Images: 30
Server Version: 20.10.12
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
 userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
Default Runtime: runc
Init Binary: docker-init
containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
runc version: v1.1.4-0-g5fd4c4d
init version: de40ad0
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-1127.18.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.7GiB
Name: master01
ID: EXII:NDBF:JXGN:XQ4U:4U64:AXUJ:YL6W:RR3U:FXBN:6YXP:RA2I:SR4Q
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://coy8g925.mirror.aliyuncs.com/
Live Restore Enabled: fals

修改对应文件系统,可以通过/etc/docker/daemon.json文件的 "storage-driver":参数

[root@master01 diff]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://coy8g925.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

下面我们就以Centos发行版的overlay2文件系统进行介绍,其实不管是什么发行版,其原理都如出一辙。

 如上图所示,OverlayFS将单个Linux主机上的两个目录合并成一个目录,这些目录被称为层,统一过程被称为联合挂载。OverlayFS关联的底层目录称为lowerdir,lowerdir是只读的镜像层(image layer),其中就包含bootfs/rootfs层,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,当boot成功 kernel 被加载到内存中,bootfs就被umount了,rootfs(root file system)包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录。lowerdir是可以分很多层的,除了bootfs/rootfs层以外,还可以通过Dockerfile建立很多image层。

对应的高层目录upperdir层是lowerdir的上一层,只有这一层可读可写的,其实就是Container层,在启动一个容器的时候会在最后的image层的上一层自动创建,所有对容器数据的更改都会发生在这一层。

联合挂载后merged层就是联合挂载层,也就是给用户暴露的统一视觉,将image层和container层结合,就如最上边的图中描述一致,同一文件,在此层会展示离它最近的层级里的文件内容,或者可以理解为,只要container层中有此文件,便展示container层中的文件内容,若container层中没有,则展示image层中的。

如下容器的整体结构

在centos操作系统下,对应联合文件系统overlay2目录是:/var/lib/docker/overlay2,使用docker inspect [容器ID]就可以看到这几个层所在的位置。示例

 "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/102d27169c96ad73ae4213a447c69b8e14087cd79d9e666c2003429f865ac5fb-init/diff:/var/lib/docker/overlay2/a53aa8c552f5b9b40d4b94129d537441b968337c56d04ad465fccf1eec7b37de/diff:/var/lib/docker/overlay2/4b00943a82da4802be44f92017a82238bb0ae06f96580853c656984b62186b49/diff:/var/lib/docker/overlay2/bb812dc007c420ff6c38b9611847fce1cda5238afd062cd30b22a6f2f753d894/diff:/var/lib/docker/overlay2/a316058c91cf41f77fe2a9ba7930892691d28666bf4a10334f9fdf53665080f0/diff:/var/lib/docker/overlay2/4adf725bc5b919de590d71f3d89d0d11390b119223a7ab8dc13042253b33a109/diff:/var/lib/docker/overlay2/f576260e3b514adb4ce01668655d844680cdd8d6a0d9944363b0fa911fe70e23/diff:/var/lib/docker/overlay2/1acd908dc03b74b46c9b5a0874094e6f1e4ac5f941a92bc156eaa0ed6526a83b/diff:/var/lib/docker/overlay2/7564ce96c2b6969404180c8cf21c6a6f38f910c603c44c5c334c5a313d733bde/diff:/var/lib/docker/overlay2/033b441edd57c8fd0ed4ce92ffcdd75558edb027931ba43299f441d491c9b505/diff:/var/lib/docker/overlay2/e1b6ed62f93346445da2850f67b0bd2db38fdb48ce80f8f2dab18c0911ec68ab/diff:/var/lib/docker/overlay2/b93cb93f4a4c31c55cdacf68e206c2242198edd9987a10c1cc4e97f740f43caa/diff:/var/lib/docker/overlay2/caca9bc683e4219d42032ea936eb2e7c9bbc2e7b9794a86ffc82f751bfef55cc/diff:/var/lib/docker/overlay2/8b9134c075f56815dce7cf90c4ee0969059776eb3a51a65fcac2c72db9880376/diff:/var/lib/docker/overlay2/bc0532b62b0b18999419346eac9ba6be627b671a44087c25779dcf8fcf7f5fbe/diff",
                "MergedDir": "/var/lib/docker/overlay2/102d27169c96ad73ae4213a447c69b8e14087cd79d9e666c2003429f865ac5fb/merged",
                "UpperDir": "/var/lib/docker/overlay2/102d27169c96ad73ae4213a447c69b8e14087cd79d9e666c2003429f865ac5fb/diff",
                "WorkDir": "/var/lib/docker/overlay2/102d27169c96ad73ae4213a447c69b8e14087cd79d9e666c2003429f865ac5fb/work"
            },
            "Name": "overlay2"
        },

启动镜像时挂载的目录以及镜像中的文件都可以在这里找到

/var/lib/docker/overlay2/<id>/merged:这是所有镜像层合并后的结果,就是容器中进程看到的结果

/var/lib/docker/overlay2/<id>/lower 镜像层
/var/lib/docker/overlay2/<id>/upper:这是上面的读写层,用户挂载的upper层目录
/var/lib/docker/overlay2/<id>/work:文件系统的工作基础目录。

容器启动不了的一个处理技巧

如果在管理容器的时候,通过docker exec编辑容器里面的文件造成容器启动不了,通过通过docker inspect查看对应容器的UpperDir,在Linux操作系统层级进入UpperDir的目录下,找到对应的文件,修改成正确的就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker的联合文件系统(UnionFS) 的相关文章

随机推荐

  • Nvidia GPU 最新计算能力表(CUDA Compute Capability)

    对于深度学习 官方指出在GPU算力高于5 0时 可以用来跑神经网络 Jetson Products GPU Compute Capability Jetson AGX Xavier 7 2 Jetson Nano 5 3 Jetson TX
  • python实现FTP文件上传

    1 需求 通过python web server端上传大文件到FTP服务端 上传文件夹 下载文件等 1 代码 usr bin python coding UTF 8 from ftplib import FTP import os impo
  • EL表达式详解

    原文地址 http www cnblogs com Fskjb archive 2009 07 05 1517192 html EL 全名为Expression Language EL 语法很简单 它最大的特点就是使用上很方便 接下来介绍E
  • 【机器学习】SVR支持向量机回归

    回归和分类从某种意义上讲 本质上是一回事 SVM分类 就是找到一个平面 让两个分类集合的支持向量或者所有的数据 LSSVM 离分类平面最远 SVR回归 就是找到一个回归平面 让一个集合的所有数据到该平面的距离最近 我们来推导一下SVR 根据
  • VSCode提高代码开发效率插件:(一)差异对比插件

    写代码经常会用到代码对比的功能 以前常用独立的软件Merge Vscode中也有类似功能的插件 之前开发单片机一直用的Keil 但是用Keil编译去掉BroseInformation速度提上来了但是没法函数跳转了 Vscode可以解决这个问
  • 如何在VS 2017运行别人的C语言代码

    如何在VS 2017运行别人的C语言代码 我们在使用VS 2017的时候 只有C 项目没有C项目 如何运行从网上下载的别人的C语言项目代码呢 经过查找资料后 经过如下具体步骤 便能在VS 2017里运行C程序了 目录 如何在VS 2017运
  • ubuntu1804安装python3.8+odoo14

    如题 博主废了不少劲 折腾了一个上午终于搞定了 本次采用环境是ubuntu1804系统的docker容器 并且容器内部已更换阿里源 编辑阿里源 vi etc apt sources list 然后粘贴下面内容 再保存 deb http mi
  • 打印图像模糊问题解决方法

    思路 核心 图像转换 1 修改图像dpi值 2 使用高质量的双三次插值法 3 指定高质量 C Code 如下
  • 期货交易的主要特征(期货交易特征五大特征)

    期货交易的特点有哪些 一 合约标准化 期货交易是通过买卖期货合约进行的 而期货合约是标准化的 期货合约标准化指的是除价格外 期货合约的所有条款都是预先由期货交易所规定好的 具有标准化的特点 二 交易集中化 期货交易必须在期货交易所内进行 期
  • NGINX代理导致 获取不到请求头中的token信息

    原因 NGINX对header有所限制 下划线 不支持 解决方式1 请求头参数不用带下划线参数 解决方式2 在nginx里的nginx conf配置文件中的http部分中添加如下配置 underscores in headers on 默认
  • 生信人的20个R语言习题

    生信人的20个R语言习题 题目原文 http www bio info trainee com 3409 html 参考答案 https www jianshu com p dd4e285665e1 https www jianshu co
  • 多变量处理的LASSO方法

    1 lasso方法 其中 因变量是Y 自变量是X 数据中的变量众多 但如何选择X 就使用了lasso lasso能够对变量进行筛选和对模型的复杂程度进行降低 这里的变量筛选是指不把所有的变量都放入模型中进行拟合 而是有选择的把变量放入模型从
  • Longest Common Substring

    给出两个字符串 找到最长公共子串 并返回其长度 注意事项 子串的字符应该连续的出现在原字符串中 这与子序列有所不同 Lintcode上的一道题目 非常经典 需要找到最长的连续公共子串的长度 因为有两个序列且前后顺序不可以打乱 所以为双序列问
  • ESP8266基础开发(一)---读DHT11温湿度传感器

    注 对于ESP8266开源技术感兴趣的可以加群 我们一起探索交流学习 群号 579932824 群名 ESP8266开源技术交流群 这篇文章的目的是展示如何将DHT11传感器连接到ESP8266并编写一个简单的程序来测量温度和湿度 我们假设
  • 【Git】保姆级教程:如何在 GitHub 上传大文件(≥100M)?(含自己的操作流程)

    文章目录 一 问题导读 二 自己的实际操作流程 2 1 准备工作 2 2 初始化仓库 2 3 安装git lfs 一个仓库里面执行一次就好了 2 4 跟踪一下你要上传 push 的文件或指定文件类型 2 5 添加 gitattributes
  • FPGA开发流程

    流程 设计定义 设计输入 分析和综合 功能仿真 modelsim altera 布局布线 时序仿真 modelsim altera 时序约束 IO分配以及配置文件的生成 配置 烧写FPGA 在线调试 设计定义 二选一多路器 两个输入IO a
  • Amazon SDE实习机会面试经验分享

    我通过大学申请了Amazon SDE实习 在线回合 有一个在线回合 其中包含技术性MCQ和2个编码问题 编码部分非常简单 面试过程中有7 8人入围 第一轮面对面访谈 这一回合持续了一个小时 首先 面试官要求自我介绍 后来有3个编码问题 对包
  • HTML img 强制刷新加载

    img刷新机制为url变化则刷新 当url不变时想要刷新可做如下处理 let url http pic27 nipic com 20130321 9678987 225139671149 2 jpg const time new Date
  • 浏览器默认行为(原生事件)、浏览器中网页渲染顺序

    一 浏览器的原生事件 1 浏览器中存在一些默认行为 比如 文本可复制 图片可 拖拽 这是伪拖拽 实际并没有移动 松开鼠标后 会弹出新的链接 右键会出现菜单 a标签单击会跳转等 2 为什么要阻止默认行为 如某些时候 我们需要写一个a标签 但是
  • docker的联合文件系统(UnionFS)

    docker最大的贡献就是定义了容器镜像的分层的存储格式 docker镜像技术的基础是联合文件系统 UnionFS 其文件系统是分层的 这样既可以充分利用共享层 又可以减少存储空间占用 联合挂载系统的工作原理 读 如果文件在upperdir