Docker之Namespace与Cgroup

发布时间:2020-07-20 09:17:59 作者:筱振
来源:网络 阅读:408

博文大纲:
一、Docker概述
二、Namespace概念
三、Cgroup基本概念与示例

一、Docker概述

1.Docker简介

Docker作为开源社区最火爆的项目,它是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”,docker的全部源代码都在https://github.com/docker 进行相关维护,其官网是:https://www.docker.com 。

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。如图:

Docker之Namespace与Cgroup
如图所示:鲸鱼可以看作宿主机,而集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。正如 Docker的设计宗旨一样:Buid、 Ship and Run Any App、 Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

2.Docker和虚拟机的区别

作为一种轻量级的虚拟化方式,Docker与传统虚拟机相比具有显著的优势。如图:
Docker之Namespace与Cgroup

Docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟操作系统层,而Docker容器是直接在操作系统层面之上实现的虚拟化,如图:
Docker之Namespace与Cgroup

3.Docker的使用场景

现在需要能方便地创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间、地点可获取这些资源,这正是Docker所能提供的。

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

比如:服务器从腾讯云迁移到阿里云,如果采用了Docker容器技术,迁移只需要在新的服务器上启动需要的容器即可。

4.Docker的优势:

二、Namespace概念

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

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

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这种服务本身并不占用端口,只是保持后台运行。

三、Cgroup基本概念与示例

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

Cgroup四大功能:

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

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

示例如下:

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(交换分区)
可以通过以下参数控制容器对内存的使用情况:

3.对block IO进行限制

block IO:磁盘的读写性能。

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

常用的选项有:

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

[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

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

推荐阅读:
  1. Docker——Cgroup资源限制
  2. Docker底层技术Namespace & Cgroup应用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

namespace与cgroup dock gr

上一篇:如何解决php内存不足的问题

下一篇:使用linux的MAKEDEV命令建立设备

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》