1、比较docker容器技术与传统虚拟化技术
Docker容器技术是一个与传统的虚拟化技术有些本质上的差异,传统的虚拟化技术,是站硬件物理资源的基础上,虚拟出多个OS,而后在OS的基础上构建相对独立的程序运行环境,而Docker则是在OS的基础上进行虚拟,因此,Docker轻量不少,所以其资源占用、性能消耗相比传统虚拟化都有很大的优点。docker
docker容器很快,启动和中止能够在秒级实现,比传统的虚拟化技术要快不少,docker核心解决的问题是利用容器来实现相似VM的功能,从而节省更多的硬件资源,docker容器除了运行其中的应用以外,基本不消耗额外的系统资源,从而在保证性能的同时,减少系统开销,同时,它还能够达到“一次封装,处处运行”的目的。centos
Docker和传统虚拟化的区别以下:安全
特性 | Docker容器 | 传统虚拟化技术 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
隔离性 | 资源限制 | 彻底隔离 |
性能 | 接近原生 | 弱于 |
计算机能力消耗 | 几乎无 | 损耗50%左右 |
系统支持量(单机) | 上千个 | 几十个 |
Docker和传统虚拟化的架构上的区别比较图以下:
2、NameSpace和Cgroup的概念与做用
Docker中有三个核心概念,分别是镜像、容器、仓库。而镜像的概念主要就是把运行环境和业务代码进行镜像打包,每一个镜像都会存在多个“层”,镜像层都是只读的,不能往里写数据,若是想要写,就须要在其基础之上启动成一个容器, 在容器层,咱们是可写的。网络
在镜像的多个“层”中,有一个busybox的概念,我将它理解为欺骗层。
虚拟化的技术就是来解决宿主机与虚拟机之间的耦合问题(简称“解耦”),传统虚拟化是属于彻底解耦的,而docker是属于半解耦的。关于“耦合、解耦”的概念能够参考文档:什么是耦合、解耦?架构
一、NameSpace
那么,Docker技术是如何解耦的呢?这就引入了NameSpace的概念,其目的是将某个特定的全局系统资源经过抽象的方法使得NameSpace中的进程看起来拥有他们本身的隔离的全局系统资源实例,Docker技术经过Linux内核实现了六种NameSpace,以下:ide
Namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWIPC | 信息量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_NEWUSER | 用户和用户组 |
当Docker建立一个容器时,它会建立新的以上六种NameSpace的实例,而后把容器中的全部进程放到这些NameSpace之中,使得容器这个父进程只对本身的子进程有感知,而对于宿主机其余进程一无所知,从而产生一种它就是一个独立的系统的“错觉”。
三、Cgroup
Cgroup做用:控制程序对资源的占用。性能
Cgroup的具体做用以下:spa
- 限制资源的使用:Cgroup能够对进程组使用的资源总额进行限制;
- 优先级控制:经过分配CPU时间片数量及磁盘IO带宽大小,实际上就是至关于控制子进程运行的优先级。
- 资源统计:Cgroup能够统计系统资源使用量,好比CPU使用时间,内存使用量等。可用于按量计费。
- 进程控制:恢复执行进程;
使用Cgroup,咱们能够更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提升整体的效率,这样能够在docker容器中的服务受到外部干扰时,能够将其限制在容器之中,而不会影响宿主机或其余容器的运行,提升了安全性。.net
那么,docker是如何来定义容器使用的资源呢?
(1)Cgroup的应用举例
一、基于centos镜像运行一个容器,要求CPU使用权重为512。
先来看看其不进行CPU限制时,它是什么样子的?
1)宿主机的CPU限制3d
[root@docker ~]# cat /sys/fs/cgroup/cpu/cpu.shares # 查看宿主机CPU的权重 1024
2)容器的CPU限制
[root@docker ~]# docker run -it centos [root@40033df95ce4 /]# cat /sys/fs/cgroup/cpu/cpu.shares 1024 # 能够看到和宿主机是同样的
若是不进行修改CPU的权重,那么容器与宿主机对CPU的权重都是默认的1024,这样是很危险的,由于宿主机与容器对CPU的权重同样,于是致使,它们在对CPU资源出现抢占的状况下,其可以使用的CPU资源是1:1,那么,若是在运行这个容器时,对其进行限制呢?若限制容器为512,宿主机仍是1024,那么其CPU使用权重的比例就变成了2:1,下面对容器进行限制:
[root@docker ~]# docker run -it --name test1 -c 512 centos [root@1694de884b3a /]# cat /sys/fs/cgroup/cpu/cpu.shares 512 # 能够看到已经变成了512
二、基于centos镜像运行一个容器,要求MEM为200M,MEM-SWAP为400M
1)如下是宿主机内存、交换空间的限制
[root@docker ~]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 查看内存的限制 9223372036854771712 [root@docker ~]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes # 查看交换空间的限制 9223372036854771712
2)如下是容器中对内存、交换空间的限制
[root@docker ~]# docker run -it centos [root@692e78a5fedf /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 内存限制 9223372036854771712 [root@692e78a5fedf /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes # 交换空间限制 9223372036854771712 #单位是“bytes”
能够看到容器对内存和交换空间可使用的量和宿主机是同样的,说明并无进行限制,那么如何进行限制呢?
[root@docker ~]# docker run -it --name test2 -m 200M --memory-swap 400M centos # 启动一个容器限制内存为300M,交换空间为400M [root@bfc999f40acf /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 209715200 # 查看确认,单位为bytes [root@bfc999f40acf /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes 419430400 # 查看确认,单位为bytes
三、基于centos镜像运行一个容器,要求写入速度为40M。
默认运行一个容器,不进行限制:
[root@bfc999f40acf /]# 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.203469 s, 1.0 GB/s # 结果为每秒写入468MB。 real 0m0.206s user 0m0.001s sys 0m0.167s
能够看到,若是不对其进行限制,那么会使用宿主机最大的写速度,那么怎么限制呢?
[root@docker ~]# docker run -it --name test3 --device-write-bps /dev/sda:40MB centos [root@a3cd9813e2e6 /]# 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, 4.91592 s, 42.7 MB/s # 写入速度被限制在了40MB左右 real 0m4.918s user 0m0.000s sys 0m0.155s