Docker的安全机制

一.在docker命令行设置docker的安全机制
1.设置特权级运行的容器:–privileged=true

docker run -it --name vm3  ubuntu
docker run -it --name vm3 --privileged=true ubuntu    在容器中有更多的权限

Docker的安全机制_第1张图片
Docker的安全机制_第2张图片
2.设置允许容器占用的内存大小和swap分区大小

docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 100M
# 设置提供和给vm1的内存大小为100M,内存加交换分区的大小为100M,则能处理的最大压测也是100M

Docker的安全机制_第3张图片
Docker的安全机制_第4张图片
3.

docker run --rm -it --name vm1 -m 100M  stress --vm 1 --vm-bytes 200M
# 默认swap分区的大小为内存的大小---这也是swap的最大极限

Docker的安全机制_第5张图片
4.限制容器占用的cpu

docker run --rm -it --cpu-shares 512 stress -c 1
docker run --rm -it --cpu-shares 1024 stress -c 1    
# 这两者的优先级是1024的大,但是在cpu核数充足的时候,cpu可以同时满足这两个压测,体现不出来优先级

lscpu可以看到自己cpu的核数
docker run --rm -it --cpu-shares 1024 stress -c 2
docker run --rm -it --cpu-shares 512 stress -c 2     
# 这样可以体现优先级,1024的优先级较高

Docker的安全机制_第6张图片
Docker的安全机制_第7张图片
Docker的安全机制_第8张图片

5.按每秒写入块设备的数据量设定上限

docker run --rm -it --privileged=true --device-write-bps /dev/sda:10M ubuntu
dd if=/dev/zero of=file bs=1M count=100 oflag=direct
# direct 模式就是把写入请求直接封装成io 指令发到磁盘
# 非direct 模式,就把数据写入系统缓存,然后就认为io 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘

这里写图片描述

二.利用cgroup对docker做权限限制
Linux Cgroup(Control Groups)是Linux内核提供的用于限制、记录、隔离进程组可以使用的资源(cpu、memory、IO等)的一种机制。
(一)对mem内存的限制
1.安装cgroup管理工具

yum search cgroup
yum install libcgroup.x86_64

安装好libcgroup之后,会在根下产生/cgroup,此时该目录下还没有任何东西
/etc/init.d/cgconfig start 打开cgroup(注意不能在当前目录下)
Docker的安全机制_第9张图片
Docker的安全机制_第10张图片
2.编对资源限制的

cd /cgroup/memory/
cat memory.limit_in_bytes   # 此时是对内存的吞吐量为无限大
vim /etc/cgconfig.conf
group x1 {
        memory {
                memory.limit_in_bytes =  209715200;
                # 限制使用的最大内存数
                memory.memsw.limit_in_bytes  = 209715200;
                # 限制内存和交换分区的大小之和,即交换分区的大小为0,可以分别打开交换分区和注释交换分区来做测试
                 }
}
退出当前目录重启服务/etc/init.d/cgconfig restart

3.进行压力测试

cd /dev/shm/
cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=100   

Docker的安全机制_第11张图片

(二).对CPU的限制
1.查看系统中默认对CPU的限制
Docker的安全机制_第12张图片
2.编辑/etc/cgconfig.conf文件,对CPU的资源进行限制
在cpu.shares文件中,可以对进程调度程序所处理的进程组设置CPU时间分配的比重。通过修改这个值,就可以在分组间调整CPU时间的比例。默认值为1024。

vim /etc/cgconfig.conf
group x2 {
        cpu {
                cpu.shares = 100;
                }
}

3.进行压力测试
cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &(对CPU的利用率高达99.9%)
Docker的安全机制_第13张图片

(三)对磁盘空间读写的速度限制
1.Cgroup里每个子系统(SubSystem)对应一种资源,Cgroup blkio子系统用于限制块设备I/O速率。相比IO调度权重,iops和bps限制更加直接和量化,更适合用于限制docker容器磁盘IO上限。
Docker的安全机制_第14张图片
2.编辑文件/etc/cgconfig.conf文件,对块设备的读写速度进行限制

vim /etc/cgconfig.conf
group x3 {
        blkio {
                blkio.throttle.read_bps_device = "252:0 1000000";
                # 252:0是/dev/vda这个块设备的信息
                }
}

这里写图片描述
3.进行压力测试(发现速度维持在了1000k左右)

yum install -y iotop    # 查看io进程的实时状态
cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
# 在/dev/vda上读数据,查看速度

Docker的安全机制_第15张图片

(四)freezer子系统

freezer子系统用于挂起和恢复cgroup中的进程。freezer有一个控制件:freezer.state,将FROZEN写入该文件,可以将cgroup中的进程挂起,将THAWED写入该文件,可以将已挂起的进程恢复。该文件可能读出的值有三种,其中两种就是前面已提到的FROZEN和THAWED,分别代表进程已挂起和已恢复(正常运行),还有一种可能的值为FREEZING,显示该值表示该cgroup中有些进程现在不能被frozen。当这些不能被frozen的进程从该cgroup中消失的时候,FREEZING会变成FROZEN,或者手动将FROZEN或THAWED写入一次。

1.编辑/etc/cgconfig.conf文件,允许对进程的状态进行改变

vim /etc/cgconfig.conf
group x4 {
        freezer {}
}

2.当我们利用截取命令之后,发现系统的CPU立即被消耗至大致百分之百
这里写图片描述
Docker的安全机制_第16张图片
3.在这种情况发生的时候,我们不能立即kill掉该进程,因为它可能和别的 进程共同占用某种资源,如果现在是它在使用资源,一旦kill,它会将资源释放,影响别的进程,最好的解决办法是:我们将该进程“冰冻”,观察其是否对别的进程有影响,再加以决定…..
Docker的安全机制_第17张图片
Docker的安全机制_第18张图片

三.Docker中私有镜像库的搭建
1.在网上拉取仓库的镜像

[root@foundation1 ~]# docker pull registry   
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete 
c12c92d1c5a2: Pull complete 
4fbc9b6835cc: Pull complete 
765973b0f65f: Pull complete 
3968771a7c3a: Pull complete 

Docker的安全机制_第19张图片
2.设定仓库对外的端口是5000

docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry
docker tag nginx localhost:5000/nginx

Docker的安全机制_第20张图片

3.将nginx镜像上传到自己的镜像仓库中
docker push localhost:5000/nginx
Docker的安全机制_第21张图片
3.在/opt/registry目录下树形显示(说明镜像往镜像仓库中上传的时候并非直接上传,而是一层一层上传)

cd /opt/registry/  ls
tree .

Docker的安全机制_第22张图片
4.查看镜像库中的镜像

docker images
docker rmi localhost:5000/nginx   #值是 删除localhost:5000/这个镜像库的名字
docker rmi nginx                             # 删除nginx的镜像

Docker的安全机制_第23张图片
Docker的安全机制_第24张图片
7.重新上传nginx镜像,并对镜像库改名

docker pull localhost:5000/nginx
docker tag localhost:5000/nginx nginx

Docker的安全机制_第25张图片

你可能感兴趣的:(Docker的安全机制)