Docker安全管理

Cgroup资源配置方法

Cgroup是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制

Docker通过Cgroup来控制容器使用的资源配额,包括 cpu、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制

Cgroup子系统
  • blkio:设置限制每个块设备的输入输出控制
  • 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上的线程

使用Stress工具来测试cpu和内存

使用Dockerfile创建一个stress工具镜像
[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# vim Dockerfile
FROM centos:7
MAINTAINER lzp "lzp@kgc"
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
[root@localhost stress]# docker build -t centos:stress .
创建容器
[root@localhost stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
[root@localhost stress]# docker exec -it b6f7b6a43716 bash
[root@b6f7b6a43716 /]# top

[root@localhost stress]# docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10 
[root@localhost stress]# docker exec -it d5aabd524580 bash
[root@d5aabd524580 /]# top
启动两个容器及运行查看cpu使用百分比

使用top命令查看比例,对两个容器进行比较

docker cgroup失效 docker cgroup driver_linux


docker cgroup失效 docker cgroup driver_linux_02


在默认情况下,每个Docker容器的cpu份额都是1024,单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。

CPU周期限制

两个参数控制容器CPU时钟周期
  • –cpu-period:是用来指定容器对cpu的使用要在多长时间内做一次重新分配
  • –cpu-quota:是用来指定在这个周期内,最多可以有多长时间用来跑这个容器
    与–cpu-shares不同的是。这种配置是指定一个绝对值,容器对cpu资源的使用绝对不会超过配置的值

cpu-period和cpu-quota的单位为微秒(us),cpu-period的最小值为1000微秒,最大值为1秒,默认值为0.1秒。cpu-quota的默认值为-1 ,表示不做控制。cpu-period和cpu-quota 参数一般联合使用

在多核情况下,允许容器进程需要完全占用两个CPU,则可以将cpu-period设置为100000(即0.1秒),cpu-quota设置为200000(0.2秒)
[root@localhost stress]# docker run -itd --name cpu01 --cpu-period=100000 --cpu-quota=200000 centos:stress
[root@localhost stress]# docker ps -a
[root@localhost stress]# docker exec -it dbf79db9c053 bash
[root@dbf79db9c053 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 
100000
[root@dbf79db9c053 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us 
200000

docker cgroup失效 docker cgroup driver_linux_03

CPU Core控制

对多核cpu的服务器,Docker还可以控制容器运行使用那些cpu内核,即使用–cpuset-cpus参数
这对具有多cpu的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置

[root@localhost stress]# docker run -itd --name cpu02 --cpuset-cpus=0-2 centos:stress 
//以上命令需要宿主机为双核,表示创建的容器只能使用0、1、2三个内核,最终生成的cgroup的cpu内核配置如下
[root@localhost stress]# docker ps -a
[root@localhost stress]# docker exec -it 4416c771538e bash
[root@4416c771538e /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2

docker cgroup失效 docker cgroup driver_cgroup_04