Docker之NameSpace与Cgroup

Docker容器技术是一个与传统的虚拟化技术有些本质上的差别,传统的虚拟化技术,是站硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Docker则是在OS的基础上进行虚拟,所以,Docker轻量很多,因此其资源占用、性能消耗相比传统虚拟化都有很大的优势。

docker容器很快,启动和停止可以在秒级实现,比传统的虚拟化技术要快很多,docker核心解决的问题是利用容器来实现类似VM的功能,从而节省更多的硬件资源,docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证性能的同时,减小系统开销,同时,它还可以达到“一次封装,到处运行”的目的。

Docker和传统虚拟化的区别如下:

docker和传统虚拟化的架构上的区别如下:

二、NameSpace和Cgroup的概念与作用

Docker中有三个核心概念,分别是镜像、容器、仓库。而镜像的概念主要就是把运行环境和业务代码进行镜像打包,每个镜像都会存在多个“层”,镜像层都是只读的,不能往里写数据,如果想要写,就需要在其基础之上启动成一个容器, 在容器层,我们是可写的。

在镜像的多个“层”中,有一个busybox的概念,我将它理解为欺骗层。

虚拟化的技术就是来解决宿主机与虚拟机之间的耦合问题(简称“解耦”),传统虚拟化是属于完全解耦的,而docker是属于半解耦的。关于“耦合、解耦”的概念可以参考文档:什么是耦合、解耦?

1、NameSpace

那么,Docker技术是如何解耦的呢?这就引入了NameSpace的概念,其目的是将某个特定的全局系统资源通过抽象的方法使得NameSpace中的进程看起来拥有他们自己的隔离的全局系统资源实例,Docker技术通过Linux内核实现了六种NameSpace,如下:

当Docker创建一个容器时,它会创建新的以上六种NameSpace的实例,然后把容器中的所有进程放到这些NameSpace之中,使得容器这个父进程只对自己的子进程有感知,而对于宿主机其他进程一无所知,从而产生一种它就是一个独立的系统的“错觉”。

3、Cgroup

Cgroup作用:控制程序对资源的占用。

Cgroup的具体作用如下:

  • 限制资源的使用:Cgroup可以对进程组使用的资源总额进行限制;
  • 优先级控制:通过分配CPU时间片数量及磁盘IO带宽大小,实际上就是相当于控制子进程运行的优先级。
  • 资源统计:Cgroup可以统计系统资源使用量,比如CPU使用时间,内存使用量等。可用于按量计费。
  • 进程控制:恢复执行进程;

使用Cgroup,我们可以更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体的效率,这样可以在docker容器中的服务受到外部干扰时,可以将其限制在容器之中,而不会影响宿主机或其他容器的运行,提高了安全性。

那么,docker是如何来定义容器使用的资源呢?

(1)Cgroup的应用举例

1、基于centos镜像运行一个容器,要求CPU使用权重为512。

先来看看其不进行CPU限制时,它是什么样子的?

1)宿主机的CPU限制

[[email protected] ~]# cat /sys/fs/cgroup/cpu/cpu.shares #查看宿主机CPU的权重
1024

2)容器的CPU限制

[[email protected] ~]# docker run -it centos     #运行一个容器
[[email protected] /]# cat /sys/fs/cgroup/cpu/cpu.shares   #查看其CPU的权重
1024

可以看到,如果不进行修改CPU的权重,那么容器与宿主机对CPU的权重都是默认的1024,这样是很危险的,因为宿主机与容器对CPU的权重一样,因而导致,它们在对CPU资源出现抢占的情况下,其可使用的CPU资源是1:1,那么,如果在运行这个容器时,对其进行限制呢?若限制容器为512,宿主机还是1024,那么其CPU使用权重的比例就变成了2:1,下面对容器进行限制:

[[email protected] ~]# docker run -it --name lvjianzhaoNO1 -c 512  centos
[[email protected] /]# cat /sys/fs/cgroup/cpu/cpu.shares
512         #其值变成了512

2、基于centos镜像运行一个容器,要求MEM为200M,MEM-SWAP为400M。

1)以下是宿主机内存、交换空间的限制

[[email protected] ~]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes   #查看内存的限制
9223372036854771712
[[email protected] ~]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes  #查看交换空间的限制
9223372036854771712

2)以下是容器中对内存、交换空间的限制

[[email protected] /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes   #内存的限制 9223372036854771712          #单位是“bytes”
[[email protected] /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes    #交换空间的限制
9223372036854771712         #单位是“bytes”

可以看到容器对内存和交换空间可以使用的量和宿主机是一样的,说明并没有进行限制,那么如何进行限制呢?

[ro[email protected] ~]# docker run -it --name lvjianzhaoNO2 -m 200M --memory-swap 400M centos
#启动一个容器限制内存为300M,交换空间为400M
[[email protected] /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
209715200        #查看确认,单位为bytes
[[email protected] /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes
419430400       #查看确认,单位为bytes

3、基于centos镜像运行一个容器,要求写入速度为40M。

默认运行一个容器,不进行限制:

[[email protected] /]# time dd if=/dev/zero of=a.txt bs=1M count=200 oflag=direct
#上述命令可以测试写入速度
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.447879 s, 468 MB/s   #结果为每秒写入468MB。

real    0m1.376s
user    0m0.008s
sys 0m0.348s

可以看到,如果不对其进行限制,那么会使用宿主机最大的写速度,那么怎么限制呢?

如下:

[[email protected] ~]# docker run -it --name lvjianzhaoNO3 --device-write-bps /dev/sda:40MB centos
[[email protected] /]# time dd if=/dev/zero of=a.txt bs=1M count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 5.64744 s, 37.1 MB/s   #写入速度被限制在了40MB左右

real    0m5.650s
user    0m0.002s
sys 0m0.352s

三、Docker的基础命令汇总

[[email protected] ~]# docker search dhcp     #以DHCP作为关键字进行搜索镜像
[[email protected] ~]# docker pull docker.io/networkboot/dhcpd           #下载查询出来的某个镜像
[[email protected] ~]# docker images      #查询下载的镜像
[[email protected] ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp    #改新名称及标签
[[email protected] ~]# docker rmi docker.io/networkboot/dhcpd    #删除镜像
[[email protected] ~]# docker save -o dhcptest dchp:dhcp      #导出为本地镜像
[[email protected] ~]# docker load --input dhcp     #导入镜像
#或者
[[email protected] ~]# docker load < dhcp     #导入镜像
[[email protected] ~]# docker push docker.io/ljztest/dhcp      #上传镜像
[[email protected] ~]# docker create -itd dchp:dhcp /bin/bash     #创建一个容器,并指定伪终端
#选项解释如下:
* -i:交互式
* -t:分配一个为终端
* -d:后台运行
[[email protected] ~]# docker ps -a                #查出容器的ID号
[[email protected] ~]# docker exec -it 2304f92a8158 /bin/bash     #进入一个容器
[[email protected] ~]# docker rm 2304f92a8158          #删除容器
[[email protected] ~]# docker run -it --name containerB -c 512 centos
#创建一个名为containerB的容器,设置其CPU的权重为512
[[email protected] ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos
#限制磁盘的每秒可以写入的大小为30MB
#其中还可以有以下选项:
#--device-read-bps:设置读设备的bps
#--device-write-bps:设置写入设备的bps
#--device-read-iops:设置读取设备的iops
#--device-write-iops:设置写入设备的iops。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2442435

时间: 2024-08-30 11:40:39

Docker之NameSpace与Cgroup的相关文章

Docker原理 -- namespace与CGroup

资源隔离 http://www.linuxidc.com/Linux/2015-03/115024.htm http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation

[转帖]linux namespace 和cgroup lxc

https://blog.csdn.net/xiaoliuliu2050/article/details/53443863 5.1 linux namespace 和cgroup lxc 2016年12月03日 12:53:32 阅读数:2065 Namespace:隔离技术的第一层,确保 Docker 容器内的进程看不到也影响不到 Docker 外部的进程. Control Groups:LXC 技术的关键组件,用于进行运行时的资源限制. UnionFS(文件系统):容器的构件块,创建抽象层,

Docker底层基石namespace与cgroup

容器本质上是把系统中为同一个业务目标服务的相关进程合成一组,放在一个叫做namespace的空间中,同一个namespace中的进程能够互相通信,但看不见其他namespace中的进程.每个namespace可以拥有自己独立的主机名.进程ID系统.IPC.网络.文件系统.用户等等资源.在某种程度上,实现了一个简单的虚拟:让一个主机上可以同时运行多个互不感知的系统. 此外,为了限制namespace对物理资源的使用,对进程能使用的CPU.内存等资源需要做一定的限制.这就是Cgroup技术,Cgro

利用内核cgroup机制轻松实现类似docker的系统资源管控

近几年,以docker为代表的容器技术异常火热,它的轻量.高效让人欣喜若狂,它被赋予了改变传统IT运维的使命.相信随着时间推移,以容器云为落地形式的产品将真正实现这一使命. 我们都知道docker能够实现资源的隔离和控制,正当打算引入docker来管理产品不同业务的资源占用时,发现它的隔离性是我们所不需要的,而我们都知道,docker底层实际上是利用了linux内核提供的namespace和cgroup机制,而前者是用于资源隔离的,后者是用于资源控制的.这时,我们想到了直接用cgroup来实现.

Docker 基础技术之 Linux namespace 详解

Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离.实现资源隔离的核心技术就是 Linux namespace.这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace). 隔离意味着可以抽象出多个轻量级的内核(容器

Docker基础 Linux内核命名空间之(2) ipc namespace

作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分.物有本末,事有终始.知所先后,则近道矣.理解Linux的这两大特性将有助于我们更深入的理解Docker. 在本文中我们将会使用unshare命令来演示Linux内核的IPC Namespace是如何动作的. Namespace的历史 Namespace并不是Linux才推出的东西,早在很久之前,Unix上就有类似的东西,而HPUX和Solaris商用的Conatiner更是以前

Docker Cgroup 容器资源限制

docker通过cgroup来控制容器使用的资源配额,包括CPU.内存.磁盘三大方面. 1.限制内存 查询系统中已经mount的cgroup的文件系统,这里的t表示type [[email protected] ~]# mount -t cgroup 搜索cgroup软件包 [[email protected] ~]# yum search cgroup 安装libcgroup [[email protected] ~]# yum install -y libcgroup-tools.x86_6

Ubuntu Docker介绍与安装使用

什么是Docker? docker是一个开源的应用容器引擎,系统级的轻量虚拟化技术. 应用程序的自动化部署解决方案,能够迅速创建一个容器,并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级. docker使用Go语言编写,用cgroup实现资源隔离,容器技术采用LXC,lxc是一种内核虚拟化技术,提供轻量级的虚拟化.lxc是linux内核一个特性,它允许进程或进程组运行在一块独立的空间,并能对其控制.并实现容器与宿主机资源共享. 优点? 1.轻量级资源,容器

Spring Boot工程发布到Docker

先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布,代码修改,打包,发布,再上dev/staging/prod三个代码版本,时刻要保证他们三个的环境依赖一致,比如jdk,webserver,appserver,安全设置,数据库等, 不然就导致程序跑不起来. 另一个问题,企业通常会按照功能将webserver,appserver,dbserver,f