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

发布了27 篇原创文章 · 获赞 14 · 访问量 559

猜你喜欢

转载自blog.csdn.net/weixin_45636702/article/details/104002212