Docker 在当下很火,那么,当我们谈 Docker ,谈容器的时候,我们在谈什么?或者说,你对 Docker ,对容器了解吗?容器,到底是怎么一回事儿?

Linux 容器

这篇文章着重来讲一下 Linux 容器,为什么强调 Linux 容器,而不是 Docker ,是因为 Docker 是基于虚拟化技术来实现的,但是这篇文章涉及到 Linux 容器的核心实现方面,两者不同,所以着重强调一下。

容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用装起来。这样,应用与应用之间就有了边界而不会相互干扰;同时装在沙盒里面的应用,也可以很方便的被搬来搬去,这也是 PaaS 想要的最理想的状态。

但是说起来容易,等到真正实现起来的时候,就会有难度。因为容器是运行在宿主机上面的,当它运行起来的时候,需要加载到内存中,需要 CPU 完成加法操作等等。也就是说,如果想要实现真正意义上的容器,就要解决容器和宿主机真正隔离这样的问题,但现实中这样的问题还没办法解决。

既然问题还没解决,那么我们所说的容器,是在说什么?容器的核心功能又什么?

容器核心功能

在上面已经说过,容器其实是一种沙盒技术,应用和应用之间有“边界”。所以容器的核心功能,就是通过约束和修改进程的动态表现,从而创造出一个"边界"。

这个官方语言可能会有点儿难懂,咱们换个说法。容器用英语来说就是 Container ,而 Container 的另一个意思是集装箱。提到集装箱的时候,你的脑海里第一反应是不是大船停靠在岸边,然后好多整齐划一的箱子可以运来运去。

为什么这些集装箱可以很方便的运来运去呢?因为它们大小一致,而且是箱子,对吧?所以当我们使用 Container 来形容容器的时候,就是我们想要让容器达到一个可以打包,符合标准的状态。

基于以上,我觉得咱们可以达成一个共识,就是如果想要让容器帮助我们达到一个可以打包,符合标准的状态的话,首先要解决的是什么问题?就是将容器和容器之间隔离出来,这样我才能对这个容器统一做一个操作,对不对。

对于 Docker 等大多数 Linux 容器来说,做到让容器和容器之间隔离,主要是两种技术:一种是看起来是隔离了的技术:Namespace 技术,它是用来修改进程视图的主要方法,也就是说每个 namespace 中的应用看到的是不同的 IP 地址、用户空间等;一种是用起来是隔离了的技术:Cgroups 技术,它是用来制造约束的主要手段。

也就是说,我这台服务器总共有 8G 的内存,都给这一个应用的话,其他的应用怎么跑起来呢?所以 Cgroups 技术就是对容器来做一个限制。

Namespace

Namespace 就是命名空间的意思,如果编程使用的是,面向对象的程序设计语言,那对于这个词应该不是很陌生。一个团队在一起写代码,难免会有相同的类,此时编译就会冲突。如果每个功能都有自己的命名空间,那在不同的空间里面就算类名相同,也不会有啥冲突。写程序如此,在 Linux 上跑程序也是如此。

当我们在一台 Linux 上跑多个进程时,进程有全局的进程 ID ,网络也有全局的路由表。如果多个进程使用不同的路由策略,可能会导致这些进程冲突,解决办法也很简单,将这些进程放在一个独立的 namespace 里面就可以了嘛。

说是这样说,但是有一点我希望你能明确知道,进程在静态状态下就是程序,它只是磁盘上的二进制文件罢了。只有当它运行起来时,才成为进程。所以,当我们开始运行程序时,操作系统都会为进程分配一个进程编号,这个编号就是进程的唯一标识。

假设我们开始运行了一个程序,它的 PID=100 。也就是说这个程序是第 100 个进程,在它前面还有 99 个进程。

而现在,如果我们通过 Docker 把这个程序运行在一个容器当中,那么 Docker 就会在第 100 个进程创建时,给它施一个"障眼法",让它永远看不到其他 99 个进程,这样这个程序就会误以为自己是第 1 个进程 这种机制,其实就是对被隔离应用的进程空间做了手脚,使得这些进程只能看到重新计算过的进程编号

比如上面的第 100 个进程,经过 Docker 的"障眼法"之后,误以为自己是第 1 个进程,但是实际上在宿主机的操作系统中,它还是原来的第 100 个进程。

容器限制( Cgroups )

Linux Cgroups 的全称是 Linux Control Group 。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU ,内存,磁盘,网络带宽等。

特别简单的一句话就是,你的电脑只有 8G 内存,你会允许一个进程占用你的内存到 7G 嘛?一般情况下应该是不会吧,那样的话,做其他事情不都卡的要死嘛,对不对。

所以在 Linux 中,提供了一种技术,来控制进程组所能使用的资源。Cgroups 的有很多子系统,每一项子系统都有自己独有的资源限制能力,比如:

  • blkio :为块设备设定 I/O 限制,一般用于磁盘等设备;

  • cpuset :为进程分配单独的 CPU 核和对应的内存节点;

  • memory :为进程设定内存使用的限制;

  • cpu :使用调用程序为进程控制 CPU 的访问;Linux Cgroups 的设计还是比较易用的,它就是一个子系统目录加上一组资源限制文件的组合。对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。至于在这些控制组下面的资源文件里填什么值,那就交给用户执行 docker run 时的参数来指定了。

经过以上分析,我们可以了解到,容器这个听起来玄而又玄的概念,实际上它就是操作系统上的一种特殊的进程而已。所以,容器本身并没有价值,有价值的是"容器编排"。

当我们在谈容器的时候,其实我们在谈如何更好的去编排容器。这也是为什么当下 k8s 这么火的原因。

容器与虚拟机异同

看到这里,你会不会有疑问,容器和虚拟机之间有什么不同呢?你可能看到过下面这个图片:

在这张图的左边,画出了虚拟机的工作原理,其中 Hypervisor 的软件是虚拟机主要部分,它通过硬件虚拟化功能,将主机的 cpu ,内存, I/O 设备等虚拟出来,在这些虚拟的硬件上,安装了一个新的操作系统,也就是图中的 GuestOS 。

此时,用户的应用进程就可以运行在这个虚拟的机器中,它能看到的也就只有 GuestOS 的文件和目录,使用的也是这个机器里面的虚拟设备。这就是为什么虚拟机能够将不同的应用进程相互隔离,因为它们所在的系统本来就不是同一个系统。

这张图的右边则是容器,它只由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并且是直接在宿主机上运行的。当你想要启动容器的时候,根本不需要启动整个操作系统,因为它本来就是在这个操作系统上的。

而且,因为容器直接在宿主机上,所有容器都共享这个底层操作系统,没有另外新装操作系统,这就使得容器不管是在体积上,还是启动速度方面,都会更快,开销更小,也更加容易迁移。

还记得讲容器的时候,介绍的 Namespace 技术嘛,虚拟机是真实存在的,你可以直接在自己的电脑上创建一个,但是容器不一样,它没有一个真正的“容器”运行在宿主机里面, Docker 项目帮助用户启动的,还是原来的应用进程,只是在创建这些进程时,加上了 Namespace 参数罢了,但是对于宿主机来说,本质还是进程罢了。

参考资料

1、极客时间:《深入剖析 Kubernetes》

2、《Kubernetes 进阶实战》

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

2019年容器突然火了,到底什么是容器?!相关推荐

  1. python到底能用来做啥-Python那么火,到底能用来做什么?

    如果您正在考虑学习Python,或者您最近刚开始学习, 您可能会问自己:"我到底可以用Python做什么?" 这是个棘手的问题,因为Python有很多用途. image.png 但 ...

  2. python可以用来写什么_python这么火,到底可以用来做什么?

    原标题:python这么火,到底可以用来做什么? python学习交流君羊:245648132 你用 Python 做什么,你选 Python 3 还是 Python 2? 如果你正在考虑学习 Pyt ...

  3. 计算机音乐抖音神曲,2019抖音十大神曲纯音乐 2019抖音最火的纯音乐盘点

    导语:在各种曲风的音乐中不得不说纯音乐在治愈性上是很强大的,不过曾经比较青睐纯音乐的朋友或许并不是很多,但目前抖音的出现,不少的纯音乐可以说是让不少人是心情好的时候也会循环播放,下面排行榜123网就整 ...

  4. python 比较适合用来干嘛-Python那么火,到底能用来做什么?

    如果您正在考虑学习Python,或者您最近刚开始学习, 您可能会问自己:"我到底可以用Python做什么?" 这是个棘手的问题,因为Python有很多用途. image.png 但 ...

  5. 2019年JAVA比较火的框架_2019年Java技术中当前流行的三大框架

    对于参加Java培训掌握技术的小伙伴来说,相信或多或少都会听到关于Java编程语言的三大架构.Java作为编程语言界元老级的存在,这么些年来不仅平稳的发展,而且也渐渐成为众多企业首选的编程语言.另外是 ...

  6. 宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...

    摘要 在过去几年中,我们在各种容器平台(包括Docker.Podman和Kubernetes)中发现了copy(cp)命令中存在多个漏洞.其中,迄今为止最严重的的一个漏洞是在今年7月被发现和披露的.然 ...

  7. STL 容器和迭代器连载8_访问顺序容器的元素

    2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...

  8. 【华为云技术分享】云图说 | 容器交付流水线ContainerOps,助力企业容器化转型

    摘要:华为云容器镜像服务SWR推出容器交付流水线(ContainerOps)可以帮助企业容器化转型. 容器交付流水线(ContainerOps)是华为云容器镜像服务(SWR)推出的面向从源代码到生产上 ...

  9. 2021年R2移动式压力容器充装考试及R2移动式压力容器充装考试资料

    题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:R2移动式压力容器充装考试根据新R2移动式压力容器充装考试大纲要求,安全生产模拟考试一点通将R2移动式压力容器充装模拟考试试题进行 ...

最新文章

  1. pytorch 筛选不齐
  2. 并发基础(八) java线程的中断机制
  3. [转]消息队列软件大比拼
  4. 命令行修改mysql数据库密码
  5. [数据库] ------ mysql 执行计划
  6. cartographer探秘第一章之安装编译与参数配置
  7. 511遇见易语言大漠多线程模块教程(1-12课)
  8. 淘宝网登录滑动验证报错解决办法--改参数 让淘宝检测失败 2021-4
  9. QPainter基本绘图【1】
  10. python判断邮箱格式是否正确_python:校验邮箱格式
  11. Nordic nrf 蓝牙 ble 透传应用
  12. 【Linux】一步一步学Linux——atq命令(139)
  13. LP-630K打印机无法插入放发票或纸张,只要一碰到就发出滴滴滴滴的声音的解决方法
  14. Revit二次开发之绘制钢筋
  15. 国内大陆有哪些芯片公司处于世界前10?一起看看!
  16. 12V-240V蓄电池放电容量测试仪(放电仪)功能介绍及技术参数
  17. python编程读写文件内容_Python编程中对文件和存储器的读写示例
  18. win10关闭防火墙过程(详细)
  19. sqli-labs/Less-49
  20. friso官方网站下载及官方信息

热门文章

  1. php事务 面向对象,PHP面向对象之事务脚本模式(详解)
  2. c语言自动取款机贴吧,求助 简单atm机的循环操作
  3. MFC 内部组织结构(简单单文档)
  4. 数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)
  5. Linux系统编程27:进程间通信之管道的基本概念和匿名管道与命名管道及管道特性
  6. C++11 并发指南三(Lock 详解)
  7. Java十进制转换为二进制的无符号数
  8. 编译原理中词法分析--部分实现
  9. C语言,两个超大整型数乘法
  10. 线性表:顺序栈算法实现