Docker——2——Docker的底层原理/资源限制

Docker容器底层原理

如果虚拟机内服务对内核版本有要求(如:需用到低于3.10的内核版本),这个服务就不太适合用docker来实现了,因为docker只适合内核版本大于3.10的系统上

Busybox:欺骗层(模拟不同系统的根目录)

耦合:冲突现象(例如:部署两台Nginx)

解耦:解除耦合、冲突

解耦的方法:

  • 普通虚拟化:完全型解耦
  • Docker:半解耦

在这里插入图片描述

图解:
中间的小人代表的是普通的用户,下边是电脑底层组成(宿主机),在硬件的基础之上在部署系统。我们用户、管理员通过shell终端和计算机进行交互,系统在去调用所需要的驱动程序、函数……,函数在去调动设备文件,最后返回给用户,这是单个程序的一个流程。
如果想在服务器上部署两个Nginx服务,两个Nginx都会占用80端口,怎么办?——往下看

  • 普通虚拟化-完全型解耦:
    可以通过虚拟化(VMware、KVM)的手段来解决,正上图左上所示,模拟出所需的硬件资源(CPU、MEM、DISK……)上运行,以防两 Nginx 的相互冲突,互不影响,但是对资源的消耗太浪费啦(如:1G内存、1个cpu、*磁盘),如果你的电脑8G内存的话,最多也就能开4~5台虚拟机,本机还需要留一定的空间。这就是完全虚拟化也叫完全解耦。
  • Docker-半解耦:
    理念:两个Nginx相互隔离开,两台Nginx如果需要解耦,就去解耦,如果不需要就不解耦,例如kernel就不需要解耦,docker直接去调用宿主机的kernel,这也就是在仓库下载的 centos:7 镜像只有200多M的原因啦。没有冲突的地方直接调用宿主机的资源(例如:CPU、MEM、DISK、yum源……),到底隔离了什么哪?——>Namespace了解详情。容器直接调用宿主机的资源也就意味着单台故障可能占用整个宿主机的资源,可以通过资源的限制来控制。

Namespace(名称空间)

原理:逻辑空间——> 隔离
作用:用来隔离容器
/proc /sys : 虚拟文件系统。 伪目录文件 ——> 内存

[root@docker01 ns]# pwd
/proc/1899/ns

在这里插入图片描述

namespace六项隔离,实现了容器与宿主机、容器与容器之间的隔离

  • IPC:共享内存、消息列队
  • MNT:挂载点、文件系统
  • NET:网络栈
  • PID:进程编号
  • USER:用户、组
  • UTS:主机名、域名

Cgroup(控制组)

作用: 限制docker容器对宿主机资源的使用

[root@docker01 ~]# cat /sys/fs/cgroup/cpu/tasks 
1
2
3
6
7
……

PS:tasks这个文件内的数字,记录的是进程编号。PID权重比

四大功能:

  • 1) 资源限制:cgroup可以对进程组使用的资源总额进行限制。
  • 2)优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别。
  • 3) 资源统计:cgroup可以统计系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费。同时,还支持挂起动能,也就是说通过 cgroup把所有资源限制起来,对资源都不能使用,注意着并不是说我们的程序不能使用了,只是不能使用资源,处于等待状态。
  • 4) 进程控制:可以对进程组执行挂起、恢复等操作。

内存限制

容器内存包括两个部分:物理内存和swap

可以通过参数控制容器内存的使用量:

  • -m 或者–memory:设置内存的使用限额
  • –memory-swap:设置内存+ swap的使用限额

举个栗子:运行一个容器,并且限制该容器最多使用200M内存和100M的swap

[root@docker01 ~]# docker run -itd --name container1 -m 200MB --memory-swap 300MB centos:7
f83fc684cc1dba7dd5084f813b2d1b1f8554b312741c8b9f250711ad27fbe224
[root@docker01 ~]# cat /sys/fs/cgroup/memory/docker/f83fc684cc1dba7dd5084f813b2d1b1f8554b312741c8b9f250711ad27fbe224/memory.limit_in_bytes 
209715200
#内存+swap限制
[root@docker01 ~]# cat /sys/fs/cgroup/memory/docker/f83fc684cc1dba7dd5084f813b2d1b1f8554b312741c8b9f250711ad27fbe224/memory.memsw.limit_in_bytes
314572800

————————————对比一个没有限制的容器,可以发现,如果运行容器不限制内存的话,意味着没有限制————————————

[root@docker01 ~]# docker run -itd --name container centos:7
c5a75c4ac125a84c86f26e8481a3452937d11d8fd84274bc830c1e067449cac6
[root@docker01 ~]# cat /sys/fs/cgroup/memory/docker/c5a75c4ac125a84c86f26e8481a3452937d11d8fd84274bc830c1e067449cac6/memory.limit_in_bytes 
9223372036854771712
#内存+swap限制
[root@docker01 ~]# cat /sys/fs/cgroup/memory/docker/c5a75c4ac125a84c86f26e8481a3452937d11d8fd84274bc830c1e067449cac6/memory.memsw.limit_in_bytes 
9223372036854771712

注释:docker run:运行容器、-i:可交互、-t:伪终端、-d:后台运行、–name容器命名

CPU使用限制

  • 通过-c或者–cpu-shares设置容器使用cpu的权重。(不设置默认为1024)

举个栗子:

[root@docker01 ~]# docker run -itd --name container centos:7
c5a75c4ac125a84c86f26e8481a3452937d11d8fd84274bc830c1e067449cac6
[root@docker01 ~]# cat /sys/fs/cgroup/cpu/docker/3b12aa22fad9380c4b265bd4364914fe06437c21eae577e9f9158001ff86872a/cpu.shares 
512

——————————————————对比一个没有做CPU权重限制的容器——————————————————

#这里还是使用上边创建的容器container(默认创建,没有任何限制)
[root@docker01 ~]# cat /sys/fs/cgroup/cpu/docker/c5a75c4ac125a84c86f26e8481a3452937d11d8fd84274bc830c1e067449cac6/cpu.shares 
1024

容器的Block IO

磁盘的读写

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

  • bps:每秒读写的数据量 byte per second。
  • iops:每秒IO的次数 io per second。

默认情况下,所有容器都能够平等的读写磁盘,也可以通过–blkio-weight参数改变容器的blockIO 的优先级

  • –device-read-bps: 显示读取某个设备的bps。 #首部双杠
  • –device-write-bps: 显示写入某个设备的bps。 #首部双杠
  • –device-read-iops: 显示读取某个设备的iops。 #首部双杠
  • –device-write-iops: 显示写入某个设备的iops。 #首部双杠

举个栗子:限制 container3 这个容器,写入/dev/sda这块磁盘的bps为30MB

[root@docker01 ~]# docker run -itd --name container3 --device-write-bps /dev/sda:30MB centos:7 
67ee3d126806c70f0e82e31b9f69aef79a6ad38a3f5b580faa8b1b6a3bd0c817

从/dev/zero输入,然后输出到test.out文件中,每次大小为100M,总共8次,oflag=direct 用来指定directIO方式写文件,这样才会使–device-write-bps生效

[root@docker01 ~]# docker exec -it container3 /bin/bash
[root@67ee3d126806 /]# time dd if=/dev/zero of=test.out bs=100M count=8 oflag=direct
8+0 records in
8+0 records out
838860800 bytes (839 MB) copied, 27.2005 s, 30.8 MB/s
real	0m27.202s
user	0m0.001s
sys	0m0.702s

——————————————————再运行一个没有做限制的 container 容器,对比一下速率——————————————————

#这里还是使用上边创建的容器container(默认创建,没有任何限制)
[root@docker01 ~]# docker exec -it container /bin/bash
[root@c5a75c4ac125 /]# time dd if=/dev/zero of=test.out bs=100M count=8 oflag=direct
8+0 records in
8+0 records out
838860800 bytes (839 MB) copied, 3.13828 s, 267 MB/s
real	0m3.140s
user	0m0.000s
sys	0m0.627s
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值