首页 > 其他分享 >Docker资源隔离与限制机制

Docker资源隔离与限制机制

时间:2023-06-30 18:55:20浏览次数:45  
标签:容器 隔离 Namespace 子系统 cgroup 进程 Docker 机制

Docker资源隔离与限制机制

资源隔离Namespace

Namespace是 Linux 内核一个强大的特性。每个容器都有自己单独的Namespace,运行在其中的应用都像是在独立的操作系统中运行一样。Namespace保证了容器之间彼此互不影响。

PID Namespace

不同用户的进程就是通过 PID Namespace隔离开的,且不同Namespace中可以有相同 PID 。所有的 LXC (Linux container) 进程在 Docker 中的父进程为 Docker 进程,每个 LXC 进程具有不同的Namespace。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。

NETWORK Namespace

有了 PID Namespace,每个Namespace中的 PID 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 NET Namespace实现的, 每个 NET Namespace有独立的 网络设备,IP 地址,路由表,/proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的Docker 网桥连接在一起。

IPC Namespace

容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 PID Namespace中的进程间交互,因此需要在 IPC 资源申请时加入Namespace信息,每个 IPC 资源有一个唯一的 32 位 id。

Mount Namespace

类似 chroot,将一个进程放到一个特定的目录执行。Mount Namespace允许不同Namespace的进程看到的文件结构不同,这样每个Namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个Namespace中的容器在 /proc/mounts 的信息只包含所在Namespace的 mount point。

UTS Namespace

UTS("UNIX Time-sharing System") Namespace允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

USER Namespace

每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。User Namespace 用来隔离资源的权限,权限关联着容器的安全问题。

资源限制Cgroup

Cgroup(Control Group)主要用于控制进程组对于资源的使用,资源包括内存 、 CPU 、 I/O 和 网络 等。主要包含以下两个部分:

subsystem: 一个subsystem就是一个内核模块,它被关联到一颗cgroup树之后,就会在树节点进行具体的操作。subsystem经常被称作"resource controller",因为它主要被用来调度或者限制每个进程组的资源,但是这个说法不完全准确,因为有时我们将进程分组只是为了做一些监控,观察一下他们的状态,比如perf_event subsystem。
hierarchy:一个hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。系统中可以有很多颗cgroup树,每棵树都和不同的subsystem关联,一个进程可以属于多颗树,即一个进程可以属于多个进程组,这些进程组和不同的subsystem关联

# cat /proc/cgroups 
#子系统名字       cgroup树ID  cgroup树进程组个数
#subsys_name	hierarchy	num_cgroups	    enabled
cpuset	12	14	1
cpu	6	82	1
cpuacct	6	82	1
blkio	8	81	1
memory	7	130	1
devices	11	81	1
freezer	2	14	1
net_cls	3	14	1
perf_event	5	14	1
net_prio	3	14	1
hugetlb	4	14	1
pids	9	88	1
rdma	10	14	1

cgroup 通过把进程划分成控制组(一个控制组包含一个或多个进程),并且可以对控制组进行资源使用的控制,也就是说 cgroup 作用对象是控制组。

cgroup 提供了将进程组织成控制组的能力,然后通过使用 资源控制子系统(cgroup_subsys) 来对控制组进行资源使用的控制, cgroup 支持的 资源控制子系统 有以下几种:

cpu子系统 :限制 CPU 的使用

memory子系统 :限制内存使用

cpuset子系统 :可以为进程组分配单独的 CPU 或者内存节点

cpuacct子系统 :统计CPU group的使用情况

blkio子系统 :限制I/O,一般用于磁盘

devices子系统 :限制进程使用的设备

freezer子系统 :可以挂起和恢复进程组

net_cls子系统 :可以标记进程组的网络数据包,使用 tc 模块(traffic control)对数据包进行控制

cgroup 通过把进程组织成控制组,然后通过资源控制子系统来对控制组进行资源使用的限制。

Docker网络模式

Docker的网络利用了Linux上NetWork Namespace以及虚拟网络设备veth pair。

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。
Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair)。

Docker网络创建

Docker创建容器时,关于网络的操作如下:

  • 创建一对虚拟网卡veth pair,分别放到本地主机和容器中;

  • 本地主机网卡桥接到网桥上,默认是docker0;

  • 容器网卡在容器内命名为eth0,且仅在容器内命名空间可见;

  • 网桥从可用地址段获取空闲地址分配给容器网卡,同时配置默认路由到本地主机网卡。

之后容器便可通过内部网卡与其他容器、本地主机或是其他网络进行通信。

此外容器网络可以通过--net参数进行配置:

--net=bridge:缺省值,连接到网桥

--net=host:容器直接使用本地主机网络,拥有完全的本地主机接口访问权限,不过使用时存在一定限制,首先使用本地主机已占用的端口会产生冲突,其次容器可以做一些影响本地主机系统的事情,需要小心使用

--net=container:容器与已有的容器共用一个网络栈,共享IP地址、端口等资源

--net=none:容器网络放到隔离的网络栈中,无法与其他容器或是本地主机进行通信,需要用户自行创建网卡并配置网络

标签:容器,隔离,Namespace,子系统,cgroup,进程,Docker,机制
From: https://www.cnblogs.com/Modest-Hamilton/p/17517639.html

相关文章

  • Rocky Linux9.2部署docker
    RockyLinux9.2部署docker......
  • k8s使用docker无法加载镜像Error response from daem
    1、报错信息:无法使用docker下载k8s镜像的解决办法,参考https://www.jianshu.com/p/70efa1b853f5目前国内的各大云计算厂商都提供了kubernetes的镜像服务,比如阿里云,我可以通过dockerpullregistry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.2.24  修改为:[root@master~]......
  • Java中的反射机制
    一、反射简介(一)什么是反射​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射......
  • Docker-Logstash安装
     下载Logstash7.17.3的docker镜像:dockerpulllogstash:7.17.3  修改Logstash的配置文件logstash.conf中output节点下的Elasticsearch连接地址为es:9200,配置文件地址:https://github.com/macrozheng/mall/blob/master/document/elk/logstash.confoutput{......
  • 若依微服务docker-compose部署vuepress
    若依微服务docker-compose部署vuepress......
  • Docker-Nginx安装
     下载Nginx1.22的docker镜像:dockerpullnginx:1.22 先运行一次容器(为了拷贝配置文件):dockerrun-p80:80--namenginx\-v/mydata/nginx/html:/usr/share/nginx/html\-v/mydata/nginx/logs:/var/log/nginx\-dnginx:1.22 将容器内的配置文件......
  • 解决docker占用系统根目录磁盘的问题
    方案:(同样可以适用高版本docker)当使用低版本的docker时,并没有–data-root指定,所以方案二提供软连接形式来解决该问题依旧先停止容器服务和docker服务直接移动/var/lib/docker至/home/.docker-datacp-r/var/lib/docker/home/.docker-data删除/var/lib/dockerrm-rf/var/lib/doc......
  • Linux不同发行版安装Docker全步骤
    一、CentOS安装Docker使用安装脚本安装sudoyumupdatecurl-fsSLhttps://get.docker.com/|shsystemctlstartdockersystemctlenabledocker手动安装卸载原有版本sudoyumremovedocker\docker-client\docker-client-lat......
  • CNN GRU 注意力 时序预测 基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测
    CNNGRU注意力时序预测基于加注意力机制(CNN-GRU-Attention)的时间序列预测程序,预测精度很高。可用于做风电功率预测,电力负荷预测,交通预测,负荷预测,经济预测,排放预测等标记注释清楚,可直接换数据运行。代码实现训练与测试精度分析。原创文章,转载请说明出处,资料来源:http://imgcs.......
  • docker部署mysql主从同步
    1. 规划主机ipmaster10.0.0.1slave10.0.0.12. 查看镜像,下载镜像,导入镜像的命令docker imagesdocker pullmysql:5.7dockerload-imysql.tar3. 启动镜像服务 dockerrun-d --namemysql-master -p3306:3306 -eMYSQL_ROOT_PASSWORD=root@1234 mysql:5.7.174. 复......