docker之cgroup的权限限制

一.关于cgroup

1.cgroup简介

cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被LXC、docker等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的 Linux 内核功能。cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

2.cgroup子系统

blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
cpu:使用调度程序为cgroup任务提供cpu的访问。
cpuacct:产生cgroup任务的cpu资源报告。
cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
devices:允许或拒绝cgroup任务对设备的访问。
freezer:暂停和恢复cgroup任务。
memory:设置每个cgroup的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供cgroup方便使用。
ns:命名空间子系统。
perf_event:增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及运行在特定CPU上的线程。

二.cgroup的功能实现

1.控制cpu的占用情况

[root@foundation78 ~]# mount -t cgroup    # 查看cgroup的挂载

在这里插入图片描述

[root@foundation78 ~]# cd /sys/fs/cgroup/
[root@foundation78 cgroup]# cd cpu
[root@foundation78 cpu]# mkdir x1
[root@foundation78 cpu]# ll

在这里插入图片描述

[root@foundation78 cpu]# cd x1/
[root@foundation78 x1]# cat cpu.cfs_period_us   # cpu分配的周期(微秒),默认为100000
100000
[root@foundation78 x1]# cat cpu.cfs_quota_us  # 该control group 限制占用时间,默认为-1
-1
[root@foundation78 x1]# echo 20000 >  cpu.cfs_quota_us   # 我们设置占用30%的cpu,即为20000
[root@foundation78 x1]# cat cpu.cfs_quota_us
20000
[root@foundation78 x1]# dd if=/dev/zero of=/dev/null &  # 默认占用为100%
  • 重新打开一个shell,查看cpu占用情况

[root@foundation78 ~]# top

在这里插入图片描述

[root@foundation78 x1]# ps ax

在这里插入图片描述

[root@foundation78 x1]# cat tasks 
[root@foundation78 x1]# echo 12183 > tasks   # 扔到任务列表中控管
[root@foundation78 x1]# cat tasks   # 查看任务列表
12183
[root@foundation78 x1]# cd
[root@foundation78 ~]# docker run -it --name vm1 --cpu-quota=20000 ubuntu   # 打开ubuntu的shell,控制cpu在20%左右
root@0dec1714fe3b:/# dd if=/dev/zero of=/dev/null  
  • 再次查看cpu占用量

[root@foundation78 ~]# top   # 重新打开一个shell查看cpu的占用量,控制成功

在这里插入图片描述

  • 回到ubuntu的shell

root@0dec1714fe3b:/# exit
exit
[root@foundation78 ~]# docker rm vm1
vm1
[root@foundation78 ~]# docker run -it --name vm1  ubuntu
root@97506ce5cb0d:/# dd if=/dev/zero of=/dev/null
  • 查看cpu的占用情况
    在这里插入图片描述

2.测试写入速度

[root@foundation78 ~]# cat /proc/partitions  

在这里插入图片描述

[root@foundation78 ~]# docker run -it --device-write-bps /dev/sda:30MB ubuntu
root@78745770506b:/# dd if=/dev/zero of=file bs=1M count=300 oflag=direct   
  • oflag=direct表示直连io,不经过系统缓存

在这里插入图片描述

root@78745770506b:/# fdisk -l   # 查看不到磁盘设备,因为不被允许
root@78745770506b:/# exit
exit
[root@foundation78 ~]# docker run -it --rm --privileged=true ubuntu  

--privileged默认处理是False,即不允许container内的root拥有真正的root权限,设置为true表示赋予所有权限

root@172ade00dc4a:/# fdisk -l

在这里插入图片描述

  • –privileged权限太大了,我们现在仅仅设置NET_ADMIN权限,使之可以添加ip即可

[root@foundation78 ~]# docker run -it --rm --cap-add=NET_ADMIN ubuntu
root@06e2a14fa868:/# fdisk -l
root@06e2a14fa868:/# ip addr

在这里插入图片描述

root@06e2a14fa868:/# ip addr add 172.17.0.3/24 dev eth0   # 添加ip
root@06e2a14fa868:/# ip addr   # 查看ip添加成功

在这里插入图片描述

3.增强docker容器的隔离性

[root@base1 ~]# systemctl start docker
[root@base1 ~]# ls
lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@base1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm 
[root@base1 ~]# cd /var/lib/lxcfs/
[root@base1 lxcfs]# ls    # 没有任何文件
[root@base1 lxcfs]# cd
[root@base1 ~]# lxcfs /var/lib/lxcfs/ &   # 启动 lxcfs,如果卡住,可以按回车

在这里插入图片描述

[root@base1 ~]# cd /var/lib/lxcfs/
[root@base1 lxcfs]# ls
cgroup  proc
[root@base1 lxcfs]# cd proc/   # 查看进程
[root@base1 proc]# ls
cpuinfo  diskstats  meminfo  stat  swaps  uptime
[root@base1 proc]# cd
[root@base1 ~]# docker load -i ubuntu.tar 


[root@base1 ~]# docker run -it --name vm1 -m 200m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo \
-v /var/lib/lxcfs/proc/stat:/proc/stat \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime \
ubuntu
root@d2f97169e5a6:/# free -m    # 我们可以看到total的内存为200MB,说明已经生效

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/88759236