Docker容器的本质,如何实现的 资源隔离、资源限制

docker 容器本质:

  1. 容器其实就是Linux下一个特殊的进程;

  2. Docker容器通过namespace实现进程隔离通过cgroups实现资源限制;

  3. Docker镜像(rootfs)是一个操作系统的所有文件和目录而不包括内核,Docker镜像是共享宿主机的内核的;

  4. Docker镜像是以只读方式挂载,所有的增删改都只会作用在容器层, 但是相同的文件会覆盖掉下一层,这种方式也被称为"Copy-on-write";

使用Namespace进行容器的隔离有什么缺点呢?

最大的缺点就是隔离不彻底

  1. 容器知识运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核

  2. 在Linux内核中,有很多资源和对象是不能被Namespace化的,最典型的例子是:时间即如果某个容器修改了时间,那整个宿主机的时间都会随之修改

  3. 容器给应用暴露出来的攻击面比较大,在生产环境中,没有人敢把运行在物理机上的Linux容器暴露在公网上

linux 内核的namespace机制

  • namespace 机制提供一种资源隔离方案。

  • PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的Namespace。

  • 每个 namespace下的资源对于其他的 namespace下的资源是透明的,不可见的。

Linux内核实现 namespace的一个主要目的就是实现轻量级虚拟化(容器)服务,在同一个 namespace下的进程可以感知彼此的变化,而对外界的进程一无所知,以达到独立和隔离的目的。

namespace可以隔离什么

一个容器要想与其他容器互不干扰需要能够做到:

  1. 文件系统需要是被隔离的

  2. 网络也是需要被隔离的

  3. 进程间的通信也要被隔离

  4. 针对权限,用户和用户组也需要隔离

  5. 进程内的PID也需要与宿主机中的PID进行隔离

  6. 容器也要有自己的主机名
    有了以上的隔离,我们认为一个容器可以与宿主机和其他容器是隔离开的。恰巧 Linux 的 namespace可以做到这些。

namespace 隔离内容 系统调用参数
UTS 主机名与域名 CLONE_NEWUTS
IPC 信号量、消息队列和共享内存 CLONE_NEWIPC
Network 网络设备、网络栈、端口等 CLONE_NEWNET
PID 进程编号 CLONE_NEWPID
Mount 挂载点(文件系统) CLONE_NEWNS
User 用户和用户组 CLONE_NEWUSER

Linux的 cgroups

强大内核工具cgroups

cgroups是linux内核提供的一种机制,这种机制可以根据需求把一系列任务及其子任务整合(或分隔)到按资源分等级的不同组内,从而为系统资源提供一个统一的框架。

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

cgroups 的作用

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

  • 资源限制

    cgroups可以对任务使用的资源总额进行限制。
    	
    	如 设定应用运行时使用的内存上限,一旦超过配额就发出OOM提示
    
  • 优先级分配

    通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级
    
  • 资源统计

    cgroups可以统计系统的资源使用量
    	如CPU使用时长,内存用量等,这个功能非常适用于计费
    
  • 任务控制

    cgroups 可以对任务进行挂起、恢复等操作
    

参考摘选:https://blog.csdn.net/u013302586/article/details/100573676

发布了102 篇原创文章 · 获赞 229 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_44685869/article/details/105291479