容器的基础学习

容器的基础学习

  • 至理名言:“容器本身没有价值,有价值的是容器编排”
  • 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个"边界"。
  • Cgroups技术是用来制造约束的主要手段,而NameSpace技术则是修改进程视图的主要方法。Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
  • 容器就是一种特殊的进程而已,容器是一个单进程的模型。
1-虚拟机和容器之间的对比?
  • **好处-利-**根据实验,一个运行着 CentOS 的 KVM 虚拟机启动后,在不做优化的情况下,虚拟机自己就需要占用 100~200 MB 内存。此外,用户应用运行在虚拟机里面,它对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理,这本身又是一层性能损耗,尤其对计算资源、网络和磁盘 I/O 的损耗非常大。而相比之下,容器化后的用户应用,却依然还是一个宿主机上的普通进程,这就意味着这些因为虚拟化而带来的性能损耗都是不存在的;而另一方面,使用 Namespace 作为隔离手段的容器并不需要单独的 Guest OS,这就使得容器额外的资源占用几乎可以忽略不计。

    所以说,“敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因。

  • 弊端 :不过,有利就有弊,基于 Linux Namespace 的隔离机制相比于虚拟化技术也有很多不足之处,其中最主要的问题就是:隔离得不彻底。

2-Mount 挂载点的学习
  • Mount Namespace 修改的,是容器进程对文件系统“挂载点”的认知。
  • Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。
  • Mount Namespace 正是基于对 chroot 的不断改良才被发明出来的,它也是 Linux 操作系统里的第一个 Namespace。
3-什么是rootfs?
  • rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在 Linux 操作系统中,这两部分是分开存放的,操作系统只有在开机启动时才会加载指定版本的内核镜像。

  • 正是由于 rootfs 的存在,容器才有了一个被反复宣传至今的重要特性:一致性。
  • 这种深入到操作系统的运行环境的一致性,打通了应用在本地和远端执行环境之间难以逾越的鸿沟。

4-rootfs的构成?

在这里插入图片描述

第一部分,只读层

  • 它是这个容器的rootfs 最下面的五层,对应的正是镜像的五层,它们的挂载方式都是只读的(ro+wh,即 readonly+whiteout)。

第二部分,可读写层

  • 它是这个容器的 rootfs 最上面的一层(6e3be5d2ecccae7cc),它的挂载方式为:rw,即 read write。在没有写入文件之前,这个目录是空的。而一旦在容器里做了写操作,你修改产生的内容就会以增量的方式出现在这个层中。
  • 可是,你有没有想到这样一个问题:如果我现在要做的,是删除只读层里的一个文件呢?为了实现这样的删除操作,AuFS 会在可读写层创建一个 whiteout 文件,把只读层里的文件“遮挡”起来。比如,你要删除只读层里一个名叫 foo 的文件,那么这个删除操作实际上是在可读写层创建了一个名叫.wh.foo 的文件。这样,当这两个层被联合挂载之后,foo 文件就会被.wh.foo 文件“遮挡”起来,“消失”了。这个功能,就是“ro+wh”的挂载方式,即只读 +whiteout 的含义。我喜欢把 whiteout 形象地翻译为:“白障”。
  • 所以,最上面这个可读写层的作用,就是专门用来存放你修改 rootfs 后产生的增量,无论是增、删、改,都发生在这里。而当我们使用完了这个被修改过的容器之后,还可以使用 docker commit 和 push 指令,保存这个被修改过的可读写层,并上传到 Docker Hub 上,供其他人使用;而与此同时,原先的只读层里的内容则不会有任何变化。这,就是增量 rootfs 的好处。

第三部分,Init层

  • 它是一个以“-init” 结尾的层,夹在只读层和读写层之间,Init层是Docker项目单独生成的一个内部层,专门用来存放/etc/hosts、/etc/resolv.conf等信息
  • 需要这样一层的原因是,这些文件本来属于只读的镜像的一部分,但是用户往往需要在启动容器时写入一些指定的值比如HostName,所以就需要在可读写层对他们进行修改。
  • 可是,这些修改往往只对当前容器有效,我们并不希望执行docker commit 时,把这些信息连同可读写层一起提交掉。
  • 所以,Docker的做法是,在修改了这些文件之后,以一个单独的层挂载了出来,而用户执行docker commit 只会提交可读写层,所以是不包含 这些内容的。
  • 最终,这7个层都会联合挂载到/var/lib/docker/aufs/mnt目录下,表现一个完整的镜像系统供给容器使用。
5-容器镜像将会成为未来软件的主流发布方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值