Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

02|被隔离的进程:一起来看看容器的本质

你好,我是 Chrono。
在上一次课里,我们初步了解了容器技术,在 Linux 虚拟机里安装了当前最流行的容器 Docker,还使用 docker psdocker run等命令简单操作了容器。
广义上来说,容器技术是动态的容器、静态的镜像和远端的仓库这三者的组合。不过,“容器”这个术语作为容器技术里的核心概念,不仅是大多数初次接触这个领域的人,即使是一些已经有使用经验的人,想要准确地把握它们的内涵、本质都是比较困难的。
那么今天,我们就一起来看看究竟什么是容器(即狭义的、动态的容器)。

容器到底是什么

从字面上来看,容器就是 Container,一般把它形象地比喻成现实世界里的集装箱,它也正好和 Docker 的现实含义相对应,因为码头工人(那只可爱的小鲸鱼)就是不停地在搬运集装箱。
集装箱的作用是标准化封装各种货物,一旦打包完成之后,就可以从一个地方迁移到任意的其他地方。相比散装形式而言,集装箱隔离了箱内箱外两个世界,保持了货物的原始形态,避免了内外部相互干扰,极大地简化了商品的存储、运输、管理等工作。
再回到我们的计算机世界,容器也发挥着同样的作用,不过它封装的货物是运行中的应用程序,也就是进程,同样它也会把进程与外界隔离开,让进程与外部系统互不影响。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

容器技术是当前备受关注的热门技术之一。本文通过深入探讨容器的本质,帮助读者更好地理解容器的概念和作用。文章首先通过生动的比喻,将容器比作现实世界中的集装箱,强调其封装和隔离运行中的应用程序,使其与外部系统互不影响。随后,通过实际操作Alpine和Ubuntu镜像展示了容器内外系统的隔离效果。文章阐述了容器技术对系统安全和资源隔离的重要性,强调了容器技术的优势,如轻巧、高效、资源消耗少等。最后,通过对Linux操作系统内核中的namespace、cgroup、chroot等技术的综合运用,解释了容器的隔离实现方式。整体而言,本文通过生动的比喻和实际操作,生动地解释了容器的本质和作用,为读者提供了清晰的技术概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(35)

  • 最新
  • 精选
  • Geek_b213f7
    chroot 是在 Unix 和 Linux 系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由 chroot 设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。 首先创建一个目录rootfs mkdir rootfs 然后在rootfs目录下新建三个文件 cd rootfs touch a b c 此时执行一条命令:chroot /home/centos/rootfs /bin/sh 这条命令意思是启动一个 sh 进程,并且把 /home/centos/rootfs 作为 sh 进程的根目录 此时执行命令:/bin/ls / 就可以显示a b c三个文件,说明当前进程的根目录已经变成了主机上的 /home/centos/rootfs 目录。这样就实现了当前进程与主机的隔离 Namespace Namespace 是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源。 Docker 主要用到以下五种命名空间。 pid namespace:用于隔离进程 ID。 net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等。 mnt namespace:文件系统挂载点隔离。 ipc namespace:信号量,消息队列和共享内存的隔离。 uts namespace:主机名和域名的隔离。 Cgroups Cgroups 是一种 Linux 内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘 I/O、网络等)。在容器的实现中,Cgroups 通常用来限制容器的 CPU 和内存等资源的使用。 联合文件系统 联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等。

    作者回复: awesome

    2022-07-13
    72
  • lesserror
    老师,以下这些内容会讲到吗? 我之前在了解这些概念的时候云里雾里的,希望能看到老师更加形象的讲解。 1. 容器中的数据。 2. 使用已命名的卷永久保存数据。 3. 使用绑定装载。 4. 查看映像层。 5. 缓存依赖项。 6 .了解多阶段生成。

    作者回复: 这些是容器里比较深入的知识,和专栏的主题不符,暂时还没有计划,如果感兴趣的人多可以单独写加餐文章。 这方面也可以去看docker官网上的文档,讲解的也很详细。

    2022-06-24
    2
    43
  • YueShi
    普通的进程 + namespace(一重枷锁,能看到什么进程) + cgroup(二重枷锁,能用多少资源,内存/磁盘。cpu等) + chroot(三重枷锁,能看到什么文件)= 特殊的进程 = 容器

    作者回复: nice

    2022-09-18归属地:北京
    22
  • hiDaLao
    执行docker run -it ubuntu:18.04 sh后,在容器中执行ps,发现sh的pid为1,在宿主机上执行ps auxf | grep sh,发现是能看到容器内的这个sh进程的,但pid不同。此时在容器内执行apt update,宿主机上ps同样能看到,而且是sh的子进程。说明用户运行在容器里的应用进程,跟宿主机上的其他进程一样,都由宿主机操作系统统一管理,只不过通过namespace对这些进程做了特殊的隔离

    作者回复: awesome

    2022-07-23
    14
  • 罗耀龙@坐忘
    认同“容器就是轻量级的虚拟机”?不 因为容器本质是一个进程,带着一组“隔离与限制”的进程,与虚拟机差的太远了。

    作者回复: 容器不是虚拟机,但在隔离方面又与虚拟机很像,所以从比喻的角度来看还是可以接受的。

    2022-06-24
    9
  • 马以
    1:集装箱在码头装船的时候,只要我的船只是匹配集装箱标准的船,就能无缝的装载集装箱,同样容器也是一种标准,我的船(组件)符合这种标准,我就能和容器无缝链接;比如docker-compose和后面的kubernetes,我只需要实现我的容器接口来对接容器就可以了; 2:我觉得容器和虚拟机有着本质的区别,虚拟机是虚拟出一套软硬件系统环境,我们的应用跑在虚拟机中,可以大致看作是跑在一个独立的服务器中,而容器只是一个进程,他们存在本质上的区别;如果硬要说他们的相同点,那么只是在隔离性这个广义的角度上,他们所做的事情是类似的。

    作者回复: great

    2022-06-27
    6
  • M
    没有介绍如何使用,这三个技术具体实现隔离效果吗?

    作者回复: 因为这个专栏是入门,所以不会太深入介绍它们的原理,想要深入了解可以参考张磊老师的课。

    2022-06-24
    4
    5
  • Geek_093b9e
    罗老师, 您好, 我读了一些文章,chroot 这个系统调用应该是虚拟化技术的开端(1979年), 后来慢慢有个更好的在内核层面的虚拟化技术,比如出现于2008年的LXC(基于namespace, cgroup), docker在LXC上面做了又一层封装,所以我理解当前docker底层没有用到chroot。 如有错误,请您指正。 谢谢 参考连接: https://www.codementor.io/blog/docker-technology-5x1kilcbow https://blog.aquasec.com/a-brief-history-of-containers-from-1970s-chroot-to-docker-2016

    作者回复: 是的,现在一般用的是pivot_root,但chroot是一个基本工作原理,用来解释docker还是很方便的。

    2022-08-07归属地:上海
    4
  • Andrew
    老师,如果镜像的大小是几十MB,再基于这个镜像运行10个容器所占用的硬盘大小就是*10 ?

    作者回复: 容器是运行中的进程,用的是内存,不占用硬盘,对比一下可执行文件和进程。

    2022-06-28
    2
    4
  • 星垂平野阔
    写作业: 1.容器就像预备装船的成堆集装箱,能够把船舱塞得满满当当的,因为它是直接运行在主机上的进程,主机有多少资源它就能用多少资源—等价于船舱有多大它能装多大。 2.容器不是轻量级的虚拟机,它并不是在主机上再抽象出一层操作系统。 课后感想: 运用容器也有好几年了,始终觉得这套技术非常有特色,能够把G级别的操作系统用分层文件的形式压缩成几十M的一个小进程,那么对比下载的iso操作系统它到底是少了哪些部分呢?

    作者回复: 容器只打包了系统必须的文件,不包括内核和其他很多的附件,但也有比较完整的操作系统镜像,几百M也不小。

    2022-06-24
    4
    4
收起评论
显示
设置
留言
35
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部