docker中pod是组合的多容器运行单元的意思;pod是Kubernetes里的一个基础单元,可以看做是容器的扩展或者增强型的容器,把多个进程打包在一个“Name Space”里的时候,就构成了一个pod,pod里面不同进程的应用包装仍然是独立的。
本教程操作环境:linux7.3系统、docker19.03版、Dell G3电脑。
Pod是一种组合的多容器运行单元,也是Kubernetes里的一个基础单元。你可以把它看作是一种容器的扩展或者增强型的容器。Pod里面包括一个主容器和数个辅助容器,它们共同完成一个特定的功能。把多个进程(容器也是一种隔离的进程)打包在一个Name Space里的时候,就构成了一个Pod。Pod里面不同进程的应用包装仍然是独立的(每个容器都会有自己的镜像)。
Pod的意义在于,它可以既保持主容器和辅助容器的的密切关系,又保持主容器的独立性。由于主容器和辅助容器的生命周期相同,可以同时被创建和销毁,因此把它们放在一个Pod中,可以使他们的交互更加高效。
而另一方面,主容器需要完成一些主要的工作,而另一些工作可能是有共性的,就可以单独打包由辅助容器来运行。
扩展知识
容器是什么?
要给容器下一个准确的定义,是一件不容易的事情,因为每个人看待容器的视角有所不同。在刘俊辉看来,容器既是一种计算单元的提供方式;又是一种应用的包装形式。
- 容器是一种计算单元
作为一种计算单元,容器与线程、进程、虚拟机、物理机一样(如下图所示)。在连续尺度上,越往左隔离性、安全性和开销越低,越往右则越高。而容器则恰恰是介于进程和虚拟机之间的一种计算单元。
但并非所有的应用都适合选择容器,开发者可以根据自己应用的特点和需求选择最适合的计算单元。例如,你的应用是高性能、互信的,且处于同一个管理区域,那么用线程或者进程就可以满足;但如果你的应用是多租户的,并且和其他应用运行在同一个空间,那么你就需要考虑如何将这些应用安全地隔离开,使得数据不会被泄露或性能受到影响。那么这时,容器也许就是一个不错的选择了。
因为容器是一个「高度隔离的进程」,它在一般进程的隔离基础上又增加了新的隔离机制,这些隔离机制是使用Linux的内核提供的,它包括一些命名空间(Name Spaces)和CGroup。命名空间可以分为网络、存储和计算三大类。其中,最为重要的是网络命名空间。它保证了容器的网络是独立于其他容器网络的。每个容器自己看到的文件系统和其他容器的是不共享的,每个容器只能看到自己的进程ID,而进程编号也是连续的。
而说到容器与虚拟机最大的区别,刘俊辉认为,相对于虚拟机,容器最大的特征是它没有自己独立的操作系统,而是共享其宿主机上的一个操作系统;而虚拟机则运行在「一台独立的服务器上」。因此,容器相比于虚拟机的成本会小,但隔离性却有所欠缺。
- 容器是一种应用的包装形式
有过应用开发经验的人都知道,应用并不是一个单一的可执行文件,一个稍微复杂一点的应用包括多个部分,包括:代码、可执行文件、配置依赖、外部依赖(动态链接库)等。
所以在应用发行包装的时候,需要考虑目标操作系统的版本、系统架构以及它所依赖的模块等因素。否则应用安装时会改动系统的不同部分。
而容器作为一个应用的包装,它最大的特点就是实现了应用的独立和便携,容器本身包含了应用所有的依赖,这使得它可以再任意的基础设施上运行,不会因为系统版本、架构的问题,而导致各种意外。
简单来说,Docker可以看作是一个非常成功的容器管理平台。Docker最重要的部分就是它的运行管理环境(如下图所示)。
正如上面所说,容器是一个计算单元,那么Docker的运行环境就是用来创建、管理和销毁这些计算单元的。在创建和管理这些计算单元的时候,需要用到计算单元的包装(也就是它的软件发行包),这些包装以容器镜像的方式存放在它的运行环境中,所有的容器计算单元都是通过这些镜像来创建的。
但镜像本身会有版本的发布、升级等需求,这就涉及到Docker的另一个重要组成部分DockerHub了。DockerHub有点像苹果的App Store,它是一个非常大的「容器市场」,所有常用的软件都可以在DockerHub上找到。
最后一个Docker的重要模块,就是用户界面和管理工具,它们用来向容器的运行环境发布命令或查看状态。只需要用一个Docker的命令加上一些参数,就可以实现创建、删除、查看容器的运行情况等操作。
接下来我们就来看看Docker的实际操作情况,我们会以运行一个Hello World的容器为例,讲讲Docker的使用情况。其实,只需要安装好Docker就可以尝试运行这个Hello World的容器了。
通过下面代码,我们来看看Docker做了些什么:
首先我们看到Docker在本地要去找Hello World最新版本的镜像,它发现本地并没有这个镜像后去DockerHub上把这个镜像给下载了下来。然后,这个镜像就被运行了,之后Docker后台就创建了这样一个容器。
Docker的出现,让容器应用管理变得非常轻松,运行容器只需要一个命令就可以实现。而从DockerHub上下载镜像、创建各种各样的隔离环境、创建容器与外部的网络通信环境都可以由Docker来完成。可以说Docker可以管理容器的整个生命周期。
作为对容器的总结,我们可以把容器最大的特点归纳为轻量级和完全独立部署。这两大特点与云原生的弹性无限扩展和按需使用的定位十分吻合,也正因为如此,容器成为了云原生的基石。
虽然容器和虚拟机都是计算单元,但从虚拟机到容器,并不能看做是一个简单的性能提升或架构的改变,而是一种应用理念的改变。
举个例子,从前伐木工人看书的时候会用斧子,后来大家觉得用斧子太费力气,有个高人就介绍了另一个砍树的工具「锯子」。但如果伐木工人拿着锯子去砍树的话,会发现还没有斧子好用。但事实是,斧子和锯子是两种使用的理念。
而说回容器和虚拟机理念的不同,我们可以通过下面的图表来进一步感受。
容器的典型应用可以分为两类,一类是微服务,一类是DevOps。
微服务是指系统的不同单元或功能运行不同的容器,每一个服务的容器数量可以根据自己的负载进行调整。比如,一个大系统包含用户登录、货品展示、货品交互等功能,但这个系统的各个部分并不是同时线性增加的,有些部分可能忙一些,有些部分的容量可能还有富余。
DevOps是指开发者、测试、生产过程流水线化。因为容器的「自包含」特性,当它作为标准的流通物品,可以使开发环境、测试环境和生产环境的应用包装完全一致,这样就减少了应用由于依赖关系配置错误等导致的意外,从而使得开发、测试、生产的整个流水线变得更高效。
Pod是一种组合的多容器运行单元,也是Kubernetes里的一个基础单元。你可以把它看作是一种容器的扩展或者增强型的容器。Pod里面包括一个主容器和数个辅助容器,它们共同完成一个特定的功能。把多个进程(容器也是一种隔离的进程)打包在一个Name Space里的时候,就构成了一个Pod。Pod里面不同进程的应用包装仍然是独立的(每个容器都会有自己的镜像)。
Pod的意义在于,它可以既保持主容器和辅助容器的的密切关系,又保持主容器的独立性。由于主容器和辅助容器的生命周期相同,可以同时被创建和销毁,因此把它们放在一个Pod中,可以使他们的交互更加高效。
而另一方面,主容器需要完成一些主要的工作,而另一些工作可能是有共性的,就可以单独打包由辅助容器来运行。
非常推荐大家去一个叫Katacoda的网站,它上面有大量免费的在线实验,包括Docker及Docker Image等动手操作项目,而且现在是完全免费的。大家不妨去这里动手实操起来。
当一个容器平台运行多个租户应用的时候,很容易发生「侧向攻击」,即进程利用系统的漏洞来进行权限提升,例如把自己的权限升级成管理员,从而获得对系统上运行的其他进程或容器的操作权限。目前这类漏洞通常会导致恶意的使用计算资源用来「挖矿」。
针对这一问题,目前有两种解决方案,一种是「限制系统调用」;一种是「独立内核」。
限制系统调用,指的是通过限制应用的系统调用,来降低应用的能力,从而避免对其他应用的危害。目前,Google的Givsor和IBM的Nabla都是采用的这种做法。如下图所示,原来一个应用会访问到所有的系统调用,但在Nabla的模式下,应用只会访问必要的系统调用,其他调用则都被屏蔽了。
但这种方法的弊端在于,它需要你在一开始就要给应用开放「恰到好处」的权限,如果一不小心没有开放足够的权限,那应用就可能会崩溃。
独立内核则参考了虚拟机的解决方案,它是指在容器中增加一个新的内核,这个内核是轻量化的,包括「微内核」和Unikernel两种实现方式。Unikernel和应用是编译在一起的,它们之间可以直接通过函数调用,而不需要系统调用。
这一方案的好处在于,容器本质上只是跟自己的内核打交道,而内核则是跟宿主机打交道,内核与宿主机的交互只需要一些通用的指令即可,不涉及到直接调用到危害系统的指令。目前Kata Container和京东智联云原生容器,就是采用的这种方式。
这种方式的好处在于,微内核作为一个最小化的操作系统,可以满足所有系统的调用,同时去除一些不必要的系统操作部分;它的系统启动时间非常短,可以达到秒级,同时开销比虚拟机要小。
推荐学习:《docker视频教程》
以上是docker中pod是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!