Docker之Namespace与Cgroup

博文大纲:
1、Docker概述
2、Namespace概念
3、Cgroup基本概念与示例

1、docker容器技术与传统虚拟化技术的比较

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

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

Docker和传统虚拟化的区别以下:
Docker之Namespace与Cgroup
Docker之因此拥有众多优点,与操做系统虚拟化自身的特色是分不开的。传统虚拟机须要有额外的虚拟机管理程序和虚拟操做系统层,而Docker容器是直接在操做系统层面之上实现的虚拟化,如图:
Docker之Namespace与Cgroup
Docker的使用场景安全

  • 如今须要能方便地建立运行在云平台上的应用,必需要脱离底层的硬件,同时还须要任什么时候间、地点可获取这些资源,这正是Docker所能提供的。服务器

  • Docker的容器技术能够在一条主句上轻松为任何应用建立一个轻量级的、可移植的、自给自足的容器。经过这种容器打包应用程序,意味着简化了从新部署、调试这些琐碎的重复工做,极大地提升了工做效率。markdown

  • 好比:服务器从腾讯云迁移到阿里云,若是采用了Docker容器技术,迁移只须要在新的服务器上启动须要的容器便可。
    Docker的优点:
    灵活性:在复杂的应用均可以被容器化;
    轻量级:容器利用共享的是主机的内核;
    即时性:能够随时部署更新和升级;
    通用性:一次封装,处处运行;
    伸缩性:控制容器副本数量来任意伸缩;

    2、Namespace概念

    虚拟化的技术就是用来解决宿主机与虚拟机之间的耦合问题(简称“解耦”),传统虚拟化技术是属于彻底解耦的,而docker这种虚拟化技术是属于半解耦的。网络

耦合:就是指两个或两个以上的体系或两种运动形式间经过相互做用而彼此影响以致联合起来的现象;
解耦:接触耦合、冲突现象;ide

Docker是如何解耦的呢?这就须要使用到——Namespace(命名空间)。性能

Namespace(命名空间):是Linux为咱们提供的用于分离进程树、网络接口、挂载点以及进程间通讯等资源的方法。测试

Namespace(命名空间)在docker中主要实现了六项隔离,如图:
Docker之Namespace与Cgroup
Docker经过使用Namespace(命名空间)这项技术实现了容器与容器之间、容器与docker host之间的隔离。阿里云

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

若是docker 宿主机是centos系统,运行docker容器时,容器也是centos 系统,所必需的目录、文件就是经过docker宿主机进行软链接提供的,包括宿主机的内核;但若是运行的docker容器是Ubuntu系统,其中目录、文件与centos 系统始终是会有一些区别的,那么这就须要使用到——Busybox(欺骗层)。

若是须要使用虚拟机来部署一些服务时,这些服务对内核版本有要求,那么就不太适合使用docker这种虚拟化技术,建议使用KVM等虚拟化技术。

docker这种服务自己并不占用端口,只是保持后台运行。

3、Cgroup基本概念与示例

Cgroup(控制组):是Linux内核提供的一种限制Docker容器使用Docker宿主机资源的一种机制。

Cgroup四大功能:

1)资源限制;Cgroup能够对进程组使用的资源总额进行限制;
2)优先级分配;经过分配的CPU时间片数量以及硬盘IO带宽大小,实际至关于控制了进程运行的优先级别;
3)资源统计;Cgroup能够统计系统资源使用量,好比CPU使用时间,内存使用量等,用于按量计费。同时还支持挂起功能,也就是说经过cgroup吧全部资源限制起来,对资源都不能使用,注意这并不意味说咱们的程序不能使用了,只是不能使用资源,处于等待状态;
4)进程控制;能够对进程组执行挂起、恢复等操做;

经过Cgroup,咱们就能够具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。这样就能够避免在docker容器中服务受到外部干扰时,能够将其限制在容器之中,而不会影响宿主机或其余容器的运行的,提升了安全性。

Docker是经过如下几个方面对容器使用的资源进行限制:

* 对CPU进行限制;
* 对内存、SWAP进行限制;
* 对block IO进行限制;

示例以下:

1.对CPU进行限制

[root@localhost ~]# cat /sys/fs/cgroup/cpu/cpu.shares 
1024
//查看宿主机默认的CPU权重为1024
[root@localhost ~]# docker run -it --name test centos:7         //随便建立一个容器进行测试
[root@6afc120f16e1 /]# cat /sys/fs/cgroup/cpu/cpu.shares
1024

//能够看到默认状况下,docker容器默认的CPU权重也是1024

若是不对容器进行限制的话,是很是危险的,由于Docker宿主机与Docker容器对CPU的权重值是同样的,这样,它们在对CPU资源进行抢占时,比例为1:1。显然在生产环境中须要对其作一些限制,方法以下:

[root@localhost ~]# docker run -it --name test1 -c 512 centos:7
//基于centos镜像运行一个名为test1的容易,其CPU使用的权重为512
//设置方法相对来讲,十分简单,就是添加了一个“-t”的选项而已!
[root@fc842b8af840 /]# cat /sys/fs/cgroup/cpu/cpu.shares
512
//验证是否设置是否成功

2.对物理内存、Swap进行限制
容器内存主要包括两部分:物理内存与Swap(交换分区)
能够经过如下参数控制容器对内存的使用状况:

* -m或--memory:设置内存的使用限额;
* --memory-swap:设置内存+swap的使用限制;
[root@localhost ~]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
9223372036854771712
//查看宿主机对内存的使用状况,单位是字节,这么大的数字表示没有限制
[root@localhost ~]# docker run -it --name test2 centos:7
[root@d65dd3da663c /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
9223372036854771712
//建立容器,查看容器对宿主机内存的使用状况,单位是字节,这么大的数字表示没有限制

经过如下能够看出这样是不安全的,因此须要使用如下方法对其进行限制,方法以下:

[root@localhost ~]# docker run -it --name test4 -m 200M --memory-swap 300M centos:7 
//建立一个容器,并限制容器最多使用200M内存和100M的交换分区
//--memory-swap:这个值是物理内存加Swap的值
[root@3de51b7474c5 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
209715200
//查看物理内存是否生效,单位是字节,能够自行进行换算验证
[root@3de51b7474c5 /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes 
314572800
//查看物理内存和交换分区内存是否生效,单位是字节,这个值是物理内存加Swap分区的值

3.对block IO进行限制
block IO:磁盘的读写性能。

docker中能够经过设置权重,限制bps和iops的方式控制容器读写磁盘的IO。

* bps:每秒读写的数据量
* iops:每秒IO的次数

默认状况下,全部容器都能平等的读写磁盘,也能够经过“--blkio-weight"参数改变容器的block IO的优先级。
经常使用的选项有:

* --device-read-bps:显示读取某个设备的bps;
* --device-write-bps:显示写入某个设备的bps;
* --device-read-iops:显示读取某个设备的iops;
* --device-write-iops:显示写入某个设备的iops;

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

[root@3de51b7474c5 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
//oflag=direct用来指定directIO方式写入文件,这样才会使--device-write-bps生效,主要测试读写性能 
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 1.6379 s, 512 MB/s             //不进行限制,结果为每秒写入512MB

real    0m2.022s
user    0m0.001s
sys 0m1.146s
[root@localhost ~]# docker run -it --name test5 --device-write-bps /dev/sda:30M centos:7
//建立一个容器对其限制为每秒为30M
[root@f5bd3f122881 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 26.6317 s, 31.5 MB/s               //虽然有点超出限制,可是并无限制强太多

real    0m26.633s
user    0m0.004s
sys 0m2.097s
相关文章
相关标签/搜索