本文共 5274 字,大约阅读时间需要 17 分钟。
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。[root@server2 30970]# docker run -d --name demo nginx[root@server2 ~]# docker inspect demo | grep Pid "Pid": 30970,[root@server2 3]# cd /proc/30970/[root@server2 30970]# cd ns/[root@server2 ns]# lsipc mnt net pid user uts
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。[root@server2 ns]# cd /sys/fs/cgroup/[root@server2 cgroup]# ls[root@server2 cgroup]# cd cpu[root@server2 cpu]# ls[root@server2 cpu]# cd docker/[root@server2 docker]# lsb98f6dc220c0f70b520975a632810e4947e4a08e1fe744fda6043dd2faf89725 cpu.cfs_quota_us[root@server2 docker]# docker psb98f6dc220c0
Linux Cgroups 的全称是 Linux Control Group。
Linux Cgroups 给用户暴露出来的操作接口是文件系统。
cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的 CPU 时间,以下设置表示20%的cpu时间。
docker run -it --cpu-period=100000 --cpu-quota=20000 ubunturoot@b42d93b2364b:/# dd if=/dev/zero of=/dev/null &可以再重新开一个终端,使用top查看一下cpu占用率是不是百分之二十
测试两个cpu的争抢问题,如果你是两个cpu的话首先先关掉一个cpuecho 0 > /sys/devices/system/cpu/cpu1/online[root@server2 ~]# docker run -it --rm ubunturoot@d6cb959714c5:/# dd if=/dev/zero of=/dev/null &[1] 9 ctrl+p+q退出,然后重新开个交互 root@d6cb959714c5:/# [root@server2 ~]# docker run -it --rm ubunturoot@5594429c2d0b:/# dd if=/dev/zero of=/dev/null退出刚才第二次启用的交互,下面我们可以加一个限制cpu的参数,重新进去,再次查看top中cpu占用情况
[root@server2 ~]# docker run -it --rm --cpu-shares 512 ubuntu ##设置优先级,优先级比原来少了一半root@1ed8bb0e9c41:/# dd if=/dev/zero of=/dev/null
[root@server2 docker]# pwd/sys/fs/cgroup/memory/docker[root@server2 docker]# yum install -y libcgroup-tools.x86_64[root@server2 memory]# mkdir x1[root@server2 memory]# cd x1/[root@server2 x1]# cat memory.limit_in_bytes9223372036854771712[root@server2 x1]# free -m[root@server2 x1]# echo 209715200 > memory.limit_in_bytes[root@server2 x1]# cat memory.limit_in_bytes209715200=200*1024*1024[root@server2 x1]# cd /dev/shm/[root@server2 shm]# dd if=/dev/zero of=bigfile bs=1M count=100[root@server2 shm]# free -m使用限制测试(刚才的工具) 没限制交换空间,虽然写进去了,但是使用了交换空间的内存 补充: 先设置内存,再设置交换分区,否则会出现报错。
我们测试总是输入命令cgexec 测试不太合适,这里使用规则文件测试。
[root@server2 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y[root@server2 ~]# lxcfs /var/lib/lxcfs & ##运行[root@server2 lxcfs]# docker run -it -m 256m \> -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
没有设置--privileged=true,其实是没有真正的root权限的[root@server2 ~]# docker run -it --rm --privileged=true busybox
docker run -it --cap-add=NET_ADMIN --name vm1 ubuntu
#docker inspect -f { {.HostConfig.Privileged}} vm1 false #docker inspect -f { {.HostConfig.CapAdd}} vm1 {[NET_ADMIN]}转载地址:http://zihzi.baihongyu.com/