cgroup 和命名空间之间的区别

difference between cgroups and namespaces

我最近开始学习 docker,似乎大部分繁重的工作都是由 Linux 内核使用名称空间和 cgroup 完成的。

让我感到困惑的几件事是:

  1. 命名空间和cgroup有什么区别?他们解决了哪些不同的用例?

  2. docker 在这些基础上实施了什么来获得人气?

  3. 我想知道这些功能的内部结构以及它们是如何实现的。

这两个概念的正确链接已在 PR 14307 中修复:

Under the hood, Docker is built on the following components:

The cgroups and namespaces capabilities of the Linux kernel

有:

  • cgroup:控制组为 aggregating/partitioning 任务集及其所有未来子任务提供了一种机制,将其分为具有专门行为的分层组。
  • namespace: 将全局系统资源包装在一个抽象中,使名称空间内的进程看起来它们拥有自己的全局资源的独立实例。

简而言之:

  • Cgroups = 限制您可以使用的数量;
  • 命名空间 = 限制您可以看到(并因此使用)的内容

查看更多信息“Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic" by Jérôme Petazzoni

Cgroup 涉及资源计量和限制:

  • 内存
  • CPU
  • 块I/O
  • 网络

命名空间为进程提供了它们自己的系统视图

多个命名空间:

cgroups 限制一个进程或一组进程可以使用的资源,这些资源可能是 CPU、内存、网络 I/O 或访问文件系统,而命名空间限制进程组对系统其余部分的可见性。

访问了解更多详情How Linux Kernel Cgroups And Namespaces Made Modern Containers Possible

Cgroups(control groups)做资源管理。
它决定了给容器多少宿主机资源。

例如:- 我们在 docker-compose yaml 文件中定义资源以创建服务,例如:

resources:
  limits:
    cpus: "0.1" (100 millicores)
    memory: 50M

在此示例中,我们明确要求 cgroups 将这些资源分配给特定容器。


Namespaces:提供进程隔离,容器完全隔离,独立文件系统。


命名空间有 6 种类型:
1. mount ns - 用于文件系统。
2. UTS(Unique time sharing) ns- 检查 运行 个容器
的不同主机名 3. IPC ns - 进程间通信
4. Network ns- 负责给不同的容器分配不同的ip
5. PID ns——进程id隔离
6.用户ns-不同的用户名(uid)