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容器的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
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