akcsdno 2020-01-28
docker容器与宿主机内核的关系:
查看镜像
docker images
进入容器
docker run -it centos:latest /bin/bash
docker run -it --name test centos:7 /bin/bash
查看容器根目录(与宿主机的/目录基本相同)
由此可以看出内核也相同
如果虚拟机服务对内核版本有要求,这个服务就不太适合docker来实现了。
内核,如果需要安装的服务与宿主机的内核不匹配,那么可以考虑,别的虚拟化软件,因为容器中的内核与宿主机的内核相同*。
busybox:欺骗层。
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
启动
systemctl start httpd
资源的限制
cd /sys/fs/cgroup
目录下是对cpu 内存等的各种限制
权重值
cat cpu.shares
cat tasks(pid编号)
这里记录的都是进程编号
选项: 内存限额: 容器内存包括两个部分,物理内存,和swap 可以通过参数控制容器内存使用量: -m或者--memory:设置内存的使用限额 --memory-swap:设置内存+swap的使用限额。 举个例子: 运行一个容器,并且限制该容器最多使用200M内存和100M的swap dokcer run -it -m 200M --memory-swap 300M centos:7 **进入此目录下可以清晰查看内存与swap等限制:** [ memory]# pwd /sys/fs/cgroup/memory 内存使用限制 [ memory]# cat memory.limit_in_bytes 209715200字节 内存+swap限制 [ memory]# cat memory.memsw.limit_in_bytes 314572800
对比一个没有限制的容器我们会发现,如果运行容器之后不限制内存的话,意味着没有限制。
CPU使用, 通过-c使用--cpu-shares设置容器使用cpu的权重,如果不设置,默认为1024 举个例子: 没有限制 :(1024) ** docker run -it --name containerA centos:7** [ /]# cd /sys/fs/cgroup/cpu [ cpu]# cat cpu.shares 1024(默认值) 有限制:(512) **docker run -it --name containerB -c 512 centos:7** [ cpu]# cat cpu.shares 512(限制的值) [ 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生效。 [** ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos:7 [ /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct**
[ /]# du -h test.out
800M test.out
没有对testB限制磁盘的读写(表明该下载与上传只与网速相关)
[ ~]# docker run -it --name testB centos:7
[ /]# 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
根据对比也可以看出没法限制空间利用率大小