kubernetes剖析(七)-深入理解容器镜像

Docker项目未待创建的用户进程做了以下事情

  1. 启用Linux Namespace配置
  2. 设置指定的Cgroups参数
  3. 切换进程的跟目录(Change Root)

注意

  • rootfs只是一个操作系统所包含的文件,配置和目录,并不包括操作系统内核
  • 在Linux操作系统中,这两部分是分开存放的
  • 操作系统只有在开机启动时才会加载执行指定版本的内核镜像
  • rootfs只包括了操作系统的"躯壳",并没有包括操作系统的"灵魂"

容器操作系统的"灵魂"

  • 同一台机器上的所有容器,都共享宿主机操作系统的内核
  • 容器内的与内核相关的内核参数,内核模块,和内核的直接交互都是"全局变量",牵一发而动全身

容器的一致性

  • 无论在本地,云端,还是在一台任何地方的的机器上
  • 用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就被重现出来了
  • 深入到操作系统级别的运行环境一致性,打通了应用在本地开发和远端执行环境之间难以逾越的鸿沟

联合文件系统(UnionFS)

kubernetes剖析(七)-深入理解容器镜像

第一层,只读层
他是这个容器的rootf最下面的五层,对应的正是ubuntu:latest镜像的五层
可以看到它们的挂载方式都是只读的(ro+wh即readonly+whiteout)

第二层,可读写层
它是容器rootfs最上面的一层,挂载方式为rw,即read write
在没有写入文件之前,这个目录是空的.而且一旦在容器里面做了写操作,
你的修改就会以增量的方式出现在这个层中
删除文件时,AuFS会在可读写层创建一个whiteout文件,把只读层里的文件遮挡起来

第三部分,init层
它是一个以"-init"结尾的层,夹在只读层和读写层之间
init层是Docker项目单独生成的一个内部层,专门用来存放/etc/hosts, /etc/resolv.conf等信息
需要这样一层的原因是,这些文件本来属于只读层的Ubuntu镜像的一部分
但是用户往往需要在容器启动时就写入一些指定的值比如hostname,所以就需要在读写层对他们进行修改
可以,这些修改往往只对当前的容器有效,我们并不希望执行docker commit时,
把这些信息连同可读写层一起提交掉,所以docker的做法是,在修改了这些文件之后,
以一个单独的层挂载了出来,用户执行docker commit只会提交可读写层,所以是不包含这些内容的

分层镜像的设计好处

  • 以Docker镜像为核心,将不同技术人员紧密的联系在了一起
  • 容器镜像是增量式的,每次镜像拉取,推送的内容,比完整操作系统要小得多
  • 镜像发布之后,在全世界的任何地方下载这个镜像,可以完全复制镜像制作者当时的环境
版权声明

1 本网站名称:诺言博客
2 本站永久网址:https://nuoyo.cn
3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长 QQ2469329338进行删除处理。
4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
7 如无特别声明本文即为原创文章仅代表个人观点,版权归《诺言》所有,欢迎转载,转载请保留原文链接。

给TA打赏
共{{data.count}}人
人已打赏
云原生

手动部署k8s(十一)-部署worker节点docker组件

2023-9-13 20:41:04

云原生

maven 常用配置以及如何配置代理

2023-9-15 11:31:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索