操作系统容器提供的隔离与内核提供的许多进程之间的隔离有什么不同?
每个进程已经与运行在同一内核上的任何其他进程隔离。这种隔离与容器提供的隔离有什么不同?
发布于 2017-11-20 06:06:42
每个进程已经与运行在同一内核上的任何其他进程隔离。
是吗?kill -9是如何工作的?如果我有足够的权限,我可以伸手去激活我想要的任何进程。
容器技术,如Docker、rkt和LXC,特别利用两个linux内核特性来实现“容器化”。
第一个是namespaces。在维基百科词条的开篇简介中:
名称空间是Linux内核的一个特性,用于隔离和虚拟化一组进程的系统资源。可以虚拟化的资源示例包括进程ID、主机名、用户ID、网络访问、进程间通信和文件系统。名称空间是Linux上容器的一个基本方面。
因此,我可以使用名称空间,例如,在内核级别限制进程可以看到的内容,或者限制进程可以与谁对话。我可以这样配置进程间通信和文件系统可见性,使我的kill -9命令看不到存在于不同名称空间中的进程,因此不能随意地杀死它们。
其次是control groups,它允许资源限制和隔离。Cgroups让我们告诉进程“你只能有512MB的内存和10%的主机CPU使用率”。如果我有一些丑陋的命令,它能够使用99%的CPU,那么主机上的其他进程就不会被隔离,而不必时不时地共享1%的CPU。使用Cgroups,我可以改变这一点。我可以告诉我丑陋的命令“在任何给定的时间你只能得到25%的CPU”,这就是它所能拥有的一切。
这里要记住的是,这些是linux内核特性,而不是一些固定的系统管理器工具或其他软件。Docker/rkt/LXC是围绕着内核的这两个核心特性的平台和工具,它们只是简单地利用了最基本级别的现有功能,使其更易于使用。
发布于 2017-11-20 02:15:53
如果您所说的“操作系统容器”指的是Docker之类的东西,那么我的答案就是这样。
在Docker上,您可以限制在同一台计算机上设置的每个容器的内存和CPU使用量。这里有一个链接,解释了如何以及一些不同的可能性:
https://docs.docker.com/engine/admin/resource_constraints/
而在进程中,你可以用Job对象做一些类似的事情,它们需要在你的应用程序中编码。
https://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
希望我能很好地理解这个问题。
发布于 2019-03-20 04:24:53
有两种机制可以实现这一点。
Linux
使用LINUX命名空间隔离进程
默认情况下,每个Linux系统最初都有一个名称空间。所有系统资源,如文件系统、进程ID、用户ID、网络接口和其他资源,都属于单个名称空间。但是,您可以创建其他名称空间,并在这些名称空间中组织资源。在运行进程时,您可以在其中一个命名空间中运行它。该进程将只看到同一命名空间内的资源。因为存在多种名称空间,所以一个进程不属于一个名称空间,而是属于每种名称空间中的一个。
存在以下类型的命名空间:
挂载(mnt)
进程ID (pid)
网络(net)
进程间通信
UTS
用户ID (用户)
每种命名空间类型用于隔离特定的一组资源。例如,UTS名称空间确定在该名称空间中运行的进程看到的主机名和域名。通过将两个不同的UTS名称空间分配给一对进程,您可以使它们看到不同的本地主机名。换句话说,对于这两个进程来说,它们看起来好像是在两台不同的机器上运行(至少就主机名而言是这样)。
同样,进程所属的网络名称空间决定了在进程中运行的应用程序可以看到哪些网络接口。每个网络接口只属于一个名称空间,但可以从一个名称空间移动到另一个名称空间。每个容器都使用自己的网络名称空间,因此每个容器都可以看到自己的一组网络接口。
这应该会让您对如何使用名称空间将运行在容器中的应用程序彼此隔离有一个基本的概念。
限制可用于进程的资源
容器隔离的另一半处理限制容器可以消耗的系统资源量。这是通过cgroups实现的,这是Linux内核的一个特性,它限制一个进程(或一组进程)的资源使用。进程使用的CPU、内存、网络带宽等不能超过配置的数量。这样,进程就不能占用为其他进程保留的资源,这类似于每个进程在单独的计算机上运行时的情况。
https://stackoverflow.com/questions/31237663
复制相似问题