一、容器資源控制
在server1上將環境恢復
[root@server1 ~]# docker rm vm1
vm1
在server2上一樣的操作
1.在server1上運行容器(此時是root身份,但是並不是真正意義上的root)
解決:
[root@server1 ~]# docker run -it --name vm1 --privileged=true ubuntu
–privileged=true所設置的權限過大
2.白名單的設置
[root@server1 ~]# mount -t cgroup
測試:
[root@server1 cgroup]# docker run -it --name vm1 ubuntu
二、docker的安全遺留問題
1.查看cgroup子系統的層級路徑
2.建立一個控制族羣
首先進入cpu子系統對應的層級路徑下:cd /sys/fs/cgroup/memory
通過新建文件夾創建一個memory控制族羣:mkdir x1,即新建了一個memory控制族羣:x1
新建x1之後,可以看到目錄下自動建立了相關的文件,這些文件是僞文件。
[root@server1 x1]# pwd
/sys/fs/cgroup/memory/
查看內存
- 限制mem
測試限制內存的使用
300M=30010241024
[root@server1 x1]# ll memory.limit_in_bytes
-rw-r--r-- 1 root root 0 May 19 00:35 memory.limit_in_bytes
[root@server1 x1]# echo 314572800 > memory.limit_in_bytes
[root@server1 x1]# cat memory.limit_in_bytes
314572800
/dev/shm 內存使用點
截取400M,但是此時使用限制好像並沒有生效
安裝cgroup工具
[root@server1 shm]# yum install -y libcgroup-tools.x86_64
進行截取測試:
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=400
注意:此時受到限制,超出300M限制後swap被時用了111M
- 同時限制mem和swap
[root@server1 x1]# pwd
/sys/fs/cgroup/memory/x1
[root@server1 x1]# ll memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 May 19 00:35 memory.memsw.limit_in_bytes
[root@server1 x1]# echo 314572800 > memory.memsw.limit_in_bytes
[root@server1 x1]# cat memory.memsw.limit_in_bytes
314572800
注意:此時swap沒有被使用
- 設置虛擬機的內存
[root@server1 ~]# docker run -it --name vm1 --memory 314572800 --memory-swap 314572800 ubuntu
注意:此時已經設置過,但看到的卻沒有改變
查看cgroup裏的配置信息
進入容器內查看
解決辦法:
- 安全加固
利用LXCFS增強docker容器的隔離性和資源的可見性
獲取資源,安裝lxcfs服務
[root@server1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
打開服務,打入後臺
[root@server1 ~]# lxcfs /var/lib/lxcfs/ &
[1] 4119
[root@server1 ~]# hierarchies:
0: fd: 5: perf_event
1: fd: 6: net_prio,net_cls
2: fd: 7: blkio
3: fd: 8: memory
4: fd: 9: freezer
5: fd: 10: cpuset
6: fd: 11: pids
7: fd: 12: cpuacct,cpu
8: fd: 13: devices
9: fd: 14: hugetlb
10: fd: 15: name=systemd
[root@server1 proc]# docker run -it --name vm1 -m 314572800 --memory-swap 314572800 \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
> -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
> ubuntu
cpu 的限制
測試限制cpu的使用
我們的測試示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us兩個文件。
cpu.cfs_period_us:cpu分配的週期(微秒),默認爲100000。
cpu.cfs_quota_us:表示該control group限制佔用的時間(微秒),默認爲-1,表示不限制。如果設爲20000,表示佔用20000/100000=20%的CPU。
建立一個CPU控制族羣
首先進入cpu子系統對應的層級路徑下:cd /sys/fs/cgroup/cpu
通過新建文件夾創建一個cpu控制族羣:mkdir x2,即新建了一個cpu控制族羣:x2
新建x2之後,可以看到目錄下自動建立了相關的文件,這些文件是僞文件。
[root@server1 x2]# echo 100 > cpu.shares
[root@server1 x2]# cat tasks #空
如何讓控制cpu核數
[root@server1 cpu]# dd if=/dev/zero of=/dev/null &
[2] 4425
此時使用top查看
當再次進行截取
[root@server1 cpu]# dd if=/dev/zero of=/dev/null &
[3] 4429
[root@server1 cpu]# top
注意:此時兩個任務會爭搶cpu的資源
設置任務的隊列
[root@server1 cpu]# cd x2/
[root@server1 x2]# echo 4425 > tasks #將id爲4425的設置爲等待任務
將截取的進程kill掉
[root@server1 ~]# docker run -it --name vm1 --cpu-period 100000 --cpu-quota 20000 ubuntu
此時cpu佔用率20%
此時top查看
不關閉退出,查看配置文件