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