docker的底层原理及运用

Docker虚拟化与普通虚拟化的区别
Docker虚拟化占用资源较少,更快的启动,具有更好的性能,而普通虚拟化占用资源较大启动需要1,2分钟。Docker中的容器与宿主机的内核相同,如果虚拟机服务器对内核版本有要求,这个服务就不太适合docker来实现,而适合普通虚拟化。
注意:**全虚拟化,所需要的硬件都必须准备好(KVM,vm)

docker容器与宿主机内核的关系:
查看镜像
docker images
进入容器
docker run -it centos:latest /bin/bash
docker run -it --name test centos:7 /bin/bash
查看容器根目录(与宿主机的/目录基本相同)
docker的底层原理及运用
由此可以看出内核也相同
如果虚拟机服务对内核版本有要求,这个服务就不太适合docker来实现了。
内核,如果需要安装的服务与宿主机的内核不匹配,那么可以考虑,别的虚拟化软件,因为容器中的内核与宿主机的内核相同*。

busybox:欺骗层。
Docker是不占用端口的,运用的是在后台运行(由图)
docker的底层原理及运用
解耦:解除耦合,解除冲突
耦合:冲突现象。

在docker程序run ......》新的centos系统(nginx,web
对于docker来说只是运行了一个进程而已。

Namespace和cgroup的意思与作用:
Namespace(名称空间);用来隔离容器
Cgroup(控制组):对容器资源的限制。
Namespace的六项隔离,与docker容器cgroup方面的功能:***
Namespace的六项隔离:
IPC:共享内存,消息队列
MNT:挂载点,文件系统
NET:网络栈
PID:进程编号
USER:用户。组
UTS:主机名,域名。
Namespec :六项隔离,实现了容器与宿主机,容器与容器之间的隔离。
cgroup的功能:
1》资源限制:cgroup可以对进程组使用的资源总额进行限制。
2>优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽的大小,实际上相对于控制了进程运行的优先级别
3》资源统计:cgroup可以统计系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费,同时还支持挂起动能,也就是说通过cgroup把所有资源限制起来,对资源都不能使用,注意着并不是说我们的程序不能使用了,知识不能使用资源,处于等待状态。
4》进程控制;可以对进程组执行挂起,恢复等操作。*

测试实验:
下载一个httpd
docker的底层原理及运用
启动
systemctl start httpd

资源的限制
cd /sys/fs/cgroup
目录下是对cpu 内存等的各种限制
权重值
cat cpu.shares
docker的底层原理及运用
cat tasks(pid编号)
这里记录的都是进程编号
docker的底层原理及运用

选项:
内存限额:
容器内存包括两个部分,物理内存,和swap
可以通过参数控制容器内存使用量:
-m或者--memory:设置内存的使用限额
--memory-swap:设置内存+swap的使用限额。
举个例子:
运行一个容器,并且限制该容器最多使用200M内存和100M的swap
dokcer run -it -m 200M  --memory-swap 300M centos:7
**进入此目录下可以清晰查看内存与swap等限制:**
[root@4e168a544caf memory]# pwd
/sys/fs/cgroup/memory
内存使用限制
[root@4e168a544caf memory]# cat  memory.limit_in_bytes
209715200字节
内存+swap限制
[root@4e168a544caf memory]# cat memory.memsw.limit_in_bytes
314572800

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

CPU使用,
通过-c使用--cpu-shares设置容器使用cpu的权重,如果不设置,默认为1024
举个例子:
没有限制 :(1024)
** docker  run  -it --name  containerA centos:7**
[root@dbe30b65321c /]# cd /sys/fs/cgroup/cpu
[root@dbe30b65321c cpu]# cat cpu.shares
1024(默认值)
有限制:(512)
**docker run -it  --name  containerB  -c 512  centos:7**
[root@7b8e6a807f06 cpu]# cat cpu.shares
512(限制的值)
[root@7b8e6a807f06 cpu]# pwd
/sys/fs/cgroup/cpu
**容器的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
比如:
1.限制testA这个容器。写入/dev/sda这块磁盘的bps为30MB
*docker  run  --name  testA  --device-write-bps /dev/sda:30MB centos:7*
删除容器:
*docker rm  testA*
2.从/dev/zero输入,然后输出到tet.out文件中,每次大小为1M,总共800次,oflag=direct用来指定directlO方式写文件,这样才会使—device-write-bps生效。
[**root@docker ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos:7
[root@cf54dd8861da /]# time  dd  if=/dev/zero  of=test.out  bs=1M count=800  oflag=direct**

docker的底层原理及运用
[root@cf54dd8861da /]# du -h test.out
800M test.out
没有对testB限制磁盘的读写明该下载与上传只与网速相关)
[root@docker ~]# docker run -it --name testB centos:7
[root@3a76843b4339 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 1.54945 s, 541 MB/s

real 0m1.551s
user 0m0.001s
sys 0m0.636s

根据对比也可以看出没法限制空间利用率大小