【发布时间】:2015-07-06 04:10:49
【问题描述】:
操作系统容器提供的隔离与内核提供的许多进程之间的隔离有何不同?
每个进程已经与在同一内核上运行的任何其他进程隔离。这种隔离与容器提供的隔离有何不同?
【问题讨论】:
-
你的意思是隔离是如何工作的?
-
容器不仅提供隔离。它们也是可部署的环境,具有与之关联的整个分层管理系统。
标签: containers
操作系统容器提供的隔离与内核提供的许多进程之间的隔离有何不同?
每个进程已经与在同一内核上运行的任何其他进程隔离。这种隔离与容器提供的隔离有何不同?
【问题讨论】:
标签: containers
每个进程已经与运行在同一内核上的任何其他进程隔离。
是吗? 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 是围绕内核的这两个核心特性包装的平台和工具,它们只是利用了最基本的功能,使其更加可用。
【讨论】:
如果您所说的“操作系统容器”是指 Docker 之类的东西,我的答案就在上面。
在 Docker 上,您可以限制在同一台机器上设置的每个容器的内存和 CPU 使用率。 这是一个链接,解释了如何以及一些不同的可能性:
https://docs.docker.com/engine/admin/resource_constraints/
虽然您可以在流程上使用作业对象执行类似的操作,但它们需要在您的应用中进行编码。
https://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
希望我能很好地理解这个问题。
【讨论】:
两种机制使这成为可能。
使用 LINUX 命名空间隔离进程
默认情况下,每个 Linux 系统最初都有一个命名空间。所有系统资源, 例如文件系统、进程 ID、用户 ID、网络接口等,属于 单一命名空间。但是您可以创建额外的命名空间并组织资源 穿过他们。运行进程时,您在其中一个命名空间中运行它。这 进程只会看到同一命名空间内的资源。嗯,多 存在多种命名空间,因此一个进程不属于一个命名空间,而是属于一个 各种命名空间。
存在以下几种命名空间:
挂载(mnt)
进程 ID (pid)
网络(网)
进程间通信(ipc)
悉尼科技大学
用户ID(用户)
每个命名空间种类都用于隔离特定的资源组。例如, UTS 命名空间确定进程运行的主机名和域名 在那个命名空间里面看到。通过将两个不同的 UTS 命名空间分配给一对 进程,您可以让它们看到不同的本地主机名。换句话说,对于 两个进程,看起来好像它们在两台不同的机器上运行(在 至少就主机名而言)。
同样,进程所属的网络命名空间决定了在进程内运行的应用程序可以看到哪些网络接口。每个网络接口只属于一个命名空间,但可以从一个命名空间移动到 其他。每个容器都使用自己的网络命名空间,因此每个容器都可以看到自己的一组网络接口。
这应该让您了解如何使用命名空间来隔离在容器中运行的应用程序。
限制进程可用的资源
容器隔离的另一半处理限制系统的数量 容器可以消耗的资源。这是通过 cgroups 实现的,这是一种限制进程(或一组进程)资源使用的 Linux 内核特性。一个过程 不能使用超过配置数量的 CPU、内存、网络带宽等。这样,进程就不能占用为其他进程保留的资源, 这类似于每个进程在单独的机器上运行。
【讨论】: