docker资源隔离实现方式

默认状况下,一个容器没有资源限制,几乎可使用宿主主机的全部资源。
docker提供了控制内存、cpu、block io。可是实际上主要是namespace和cgroup控制资源的隔离docker

Docker的隔离性主要运用Namespace 技术。传统上Linux中的PID是惟一且独立的,在正常状况下,用户不会看见重复的PID。然而在Docker采用了Namespace,从而令相同的PID可于不一样的Namespace中独立存在。如,A Container 之中PID=1是A程序,而B Container之中的PID=1一样能够是A程序。虽然Docker可透过Namespace的方式分隔出看似是独立的空间,然而Linux内核(Kernel)却不能Namespace,因此即便有多个Container,全部的system call其实都是经过主机的内核处理,这便为Docker留下了不能否认的安全问题。安全

namespace(命名空间)能够隔离哪些网络

  • 文件系统须要是被隔离的
  • 网络也是须要被隔离的
  • 进程间的通讯也要被隔离
  • 针对权限,用户和用户组也须要隔离
  • 进程内的PID也须要与宿主机中的PID进行隔离
  • 容器也要有本身的主机名
  • 有了以上的隔离,咱们认为一个容器能够与宿主机和其余容器是隔离开的。
  • 恰巧Linux 的namespace能够作到这些。


使用Namespace进行容器的隔离有什么缺点呢?
  最大的缺点就是隔离不完全
  1)容器知识运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就仍是同一个宿主机的操做系统内核
  2)在Linux内核中,有不少资源和对象是不能被Namespace化的,最典型的例子是:时间即若是某个容器修改了时间,那整个宿主机的时间都会随之修改
  3)容器给应用暴露出来的攻击面比较大,在生产环境中,没有人敢把运行在物理机上的Linux容器暴露在公网上工具


Linux的 cgroups
强大内核工具cgroups
cgroups是Linux的另一个强大的内核工具,有了cgroups,不只能够限制被namespace隔离起来的资源,还能够为资源设置权重、计算使用量、操控任务(进程或县城)启停等。说白了就是:cgroups能够限制、记录任务组所使用的物理资源(包括CPU,Memory,IO等),是构建Docker等一系列虚拟化管理工具的基石。spa

cgroups 的做用
  cgroups 为不一样用户层面的资源管理提供了一个统一接口,从单个的资源控制到操做系统层面的虚拟化,cgroups提供了4大功能。操作系统

  • 资源限制

cgroups能够对任务使用的资源总额进行限制。
如 设定应用运行时使用的内存上限,一旦超过配额就发出OOM提示对象

  • 优先级分配

经过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就至关于控制了任务运行的优先级接口

  • 资源统计

cgroups能够统计系统的资源使用量
如CPU使用时长,内存用量等,这个功能很是适用于计费进程

  • 任务控制

cgroups 能够对任务进行挂起、恢复等操做内存

相关文章
相关标签/搜索