在了解底层原理之前:
说几个名词:
解耦状态: 所有东西都没有重复,任何东西都没有公用的地方。
半解耦状态:有部分共同的一起用,其他的独立
完全解耦状态: 就是各自都是独立没有重复。
kvm:完全解耦
docker:半解耦
#下面通过一张图片,来解释解耦与半解耦的区别:
通过部署Nginx来说明:
完全解耦:
比如kvm,VMware就属于完全解耦,流程:硬件层肯定使用宿主机,虚拟内核,虚拟系统,虚拟lib库,虚拟驱动程序,在这基础上进行部署Nginx;
半解耦:
docker:docker部署Nginx流程:先说明,容器存在的方式,是以文件夹方式存在的,容器去部署Nginx,通过软链接,链接到宿主机的内核、OS、lib库、驱动程序,让系统以为这个文件夹是一个独立的系统,在此基础进行部署Nginx;
#上述我们知道docker是半解耦,解耦了那些方面?
说之前了解2个目录:
/proc:
/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
/sys:
docker的6项隔离:
namespace(名称空间)
通过linux内核实现的一个技术,实现容器与容器,容器与宿主机之间的隔离;
IPC | 共享内存、消息队列 |
MNT | 挂载点 |
NET | 网络栈 |
PID | 服务进程编号 |
USER | 用户、组 |
UTS | 主机名、域 |
cgroup(控制组)
同样也是通过linux内核实现的一种技术,限制docker容器资源的方式!
[root@lin cgroup]# ls
blkio cpu,cpuacct freezer net_cls perf_event
cpu cpuset hugetlb net_cls,net_prio pids
cpuacct devices memory net_prio systemd
[root@lin cgroup]# pwd
/sys/fs/cgroup
四大功能:
1、资源限制
cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(OutofMemory)。
2、优先级分配
通过分配的cpu时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。
3、资源统计
cgroups可以统计系统的资源使用量,如cpu使用时长、内存用量等等,这个功能非常适用于计费。
4、进程控制
cgroups可以对进程组执行挂起、恢复等操作。
#对内存的300MB和swap的限制300MB。
1 [root@lin /]# docker run -itd --name a1 -m 300M --memory-swap 300M busyBox:latest 2 Unable to find image 'busyBox:latest' locally 3 latest: Pulling from library/busyBox 4 e5d9363303dd: Pull complete 5 Digest: sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f 6 Status: Downloaded newer image for busyBox:latest 7 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115 8 #查看限制 9 [root@lin /]# cd /sys/fs/cgroup/memory/docker/49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115/ 10 [root@lin 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115]# cat memory.limit_in_bytes 11 314572800 #查看mem 12 [root@lin 49eb02aa8194b3d788bb0f98bca1b09ee38c68efecf04406ee341ed03a70b115]# cat memory.memsw.limit_in_bytes 13 #查看swap 14 ps:创建swap的时候要注意数值位只是是内存的1倍
1 [root@lin docker]# docker run -itd --name a2 -c 512 busyBox:latest 2 adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f 3 [root@lin adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f]# cat cpu.shares 4 512 #等于512 5 [root@lin adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f]# pwd 6 /sys/fs/cgroup/cpu/docker/adebf96dc88a1b26a2d8cf3a23f93c9950f0c9f6d2c3eb10892c35bf5290e73f2c3eb10892c35bf5290e73f/ 8 ps:默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。例如,两个容器A、B的cpu份额分别为1000和500,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得cpu的时间片。
##实现block io的限制
io分为磁盘io和带宽io。
1 设置容器A的磁盘读写权重为600 2 3 [root@lin /]# docker run -itd --name a3 --blkio-weight 600 busyBox:latest 76377305213db266a1f773d115db3dbebef7a34acd31d5ad81a764b2a24f24c5 4 [root@lin /]# docker exec -it a3 sh 5[root@lin /]# cat /sys/fs/cgroup/blkio/blkio.weight
600
#bps和iops的限制
-
–device-read-bps:限制读某个设备的bps
@H_546_403@ -
–device-write-bps:限制写某个设备的bps
@H_546_403@ -
–device-read-iops:限制读某个设备的iops
@H_546_403@ -
–device-write-iops:限制写某个设备的iops
@H_546_403@
举例:将容器的sda系统盘的读写速率设置为50MB/s
[root@lin /]# docker run -it --name dps --device-write-bps /dev/sda:50MB centos:7 sh
sh-4.2# time dd if=/dev/zero of=test bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied,15.9181 s, 52.7 MB/s #50MB左右
real 0m15.920s
user 0m0.000s
sys 0m0.514s