Docker的底层原理

Docker底层原理

如果虚拟机内服务对内核版本有要求,这个服务就不太适合用docker来实现了

 

Busybox:欺骗层

 

解耦:解除耦合、解除冲突

耦合:冲突现象

 

run----->Centos系统(nginx、web)

对于docker host来说这个系统仅仅是一个进程

 

Namespace(名称空间):

用来隔离容器

[root@localhost ns]# pwd
/proc/2971/ns
[root@localhost ns]# ls
ipc  mnt  net  pid  user  uts

ipc:共享内存、消息列队

mnt:挂载点、文件系统

net:网络栈

pid:进程编号

user:用户、组

uts:主机名、域名

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

 

Cgroup(控制组):

资源的限制

[root@d9d679199f74 cgroup]# pwd
/sys/fs/cgroup
[root@localhost cpu]# cat  tasks

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

四大功能:

1)资源限制:cgroup可以对进程组使用的资源总额进行限制

2)优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别

3)资源统计:cgroup可以统计西系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费。同时还支持挂起功能,也就是说用过cgroup把所有的资源限制起来,对资源都不能使用,注意并不算是说我们的程序不能使用了,只是不能使用资源,处于挂起等待状态

4)进程控制:可以对进程组执行挂起、恢复等操作

 

内存限额:

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

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

-m或者--memory:设置内存的使用限额

--memory-swap:设置内存+swap的使用限额

 

举个例子:

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

[root@localhost ~]# docker run  -it  -m 200M --memory-swap 300M centos:7
[root@5bc0e71faba3 memory]# pwd
/sys/fs/cgroup/memory

//内存使用限制

[root@5bc0e71faba3 memory]# cat memory.limit_in_bytes 
209715200(字节)

//内存+swap限制

[root@5bc0e71faba3 memory]# cat memory.memsw.limit_in_bytes
314572800(字节)

 

对比一个没有限制的容器,我们会发现,如果运行容器之后不限制内存的话,意味着没有限制

 

CPU使用:

通过-c或者--cpu-shares设置容器使用cpu的权重,如果 不设置默认为1024

 

举个例子:

//没有限制:1024

[root@localhost ~]# docker run  -it --name  containerA  centos:7
[root@e2d88b8f8b87 /]# cd  /sys/fs/cgroup/cpu
[root@e2d88b8f8b87 cpu]# cat cpu.shares 
1024

//限制CPU使用权重为512:

[root@localhost ~]# docker run  -it  --name  containerB  -c  512  centos:7
[root@f8165e07c8d7 /]# cd  /sys/fs/cgroup/cpu
[root@f8165e07c8d7 cpu]# cat  cpu.shares 
512

容器的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

 

//限制testA这个容器,写入/dev/sda这块磁盘的bps为30MB

[root@localhost ~]# docker run  -it --name  testA  --device-write-bps  /dev/sda:30MB centos:7

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

[root@0e659ca3e85d /]# time dd  if=/dev/zero of=test.out bs=1M count=800 oflag=direct

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值