一.在docker命令行设置docker的安全机制
1.设置特权级运行的容器:–privileged=true
docker run -it --name vm3 ubuntu
docker run -it --name vm3 --privileged=true ubuntu 在容器中有更多的权限
docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 100M
# 设置提供和给vm1的内存大小为100M,内存加交换分区的大小为100M,则能处理的最大压测也是100M
docker run --rm -it --name vm1 -m 100M stress --vm 1 --vm-bytes 200M
# 默认swap分区的大小为内存的大小---这也是swap的最大极限
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的优先级较高
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(注意不能在当前目录下)
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
(二).对CPU的限制
1.查看系统中默认对CPU的限制
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%)
(三)对磁盘空间读写的速度限制
1.Cgroup里每个子系统(SubSystem)对应一种资源,Cgroup blkio子系统用于限制块设备I/O速率。相比IO调度权重,iops和bps限制更加直接和量化,更适合用于限制docker容器磁盘IO上限。
2.编辑文件/etc/cgconfig.conf文件,对块设备的读写速度进行限制
vim /etc/cgconfig.conf
group x3 {
blkio {
blkio.throttle.read_bps_device = "252:0 1000000";
# 252:0是/dev/vda这个块设备的信息
}
}
yum install -y iotop # 查看io进程的实时状态
cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
# 在/dev/vda上读数据,查看速度
(四)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立即被消耗至大致百分之百
3.在这种情况发生的时候,我们不能立即kill掉该进程,因为它可能和别的 进程共同占用某种资源,如果现在是它在使用资源,一旦kill,它会将资源释放,影响别的进程,最好的解决办法是:我们将该进程“冰冻”,观察其是否对别的进程有影响,再加以决定…..
三.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 run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry
docker tag nginx localhost:5000/nginx
3.将nginx镜像上传到自己的镜像仓库中
docker push localhost:5000/nginx
3.在/opt/registry目录下树形显示(说明镜像往镜像仓库中上传的时候并非直接上传,而是一层一层上传)
cd /opt/registry/ ls
tree .
docker images
docker rmi localhost:5000/nginx #值是 删除localhost:5000/这个镜像库的名字
docker rmi nginx # 删除nginx的镜像
docker pull localhost:5000/nginx
docker tag localhost:5000/nginx nginx