文章目录
一、网络资源控制
firewalld防火墙中自带nat地址转换功能,所以不要关闭,只需要把setenforce 0核心防护关闭就行了
1、查看docker网络信息
[root@localhost ~]# docker network ls
网络模式详解
安装Docker时,它会自动创建三个网络,bridge (创建容器默认连接到此网络)、none 、host
host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。(与宿主机共享)
None:该模式关闭了容器的网络功能。
Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。(默认为该模式)
Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。(容器和另外一个容器共享)
以上都是不用动手的,真正需要配置的是自定义网络。
docker装完以后会多一个docker0网卡
docker0:虚拟容器网关(所有容器的网关:172.17.0.1)
2、配置docker网络
① bridge自动给分配
桥接bridge模式会自动分配给容器一个IP地址,无法手动指定IP
例如:
[root@localhost ~]# docker run -itd --name test1 --network bridge --ip 172.17.0.100 centos:7 /bin/bash
现在我们正常选择bridge模式,不手动指定ip尝试创建
[root@localhost ~]# docker run -itd --name test1 --network bridge centos:7 /bin/bash
可以看到是可以创建成功的,并且是开启状态
登录容器查看IP
容器里面是什么都没有的,所以需要下载工具才可以使用ifconfig查看IP
[root@localhost ~]# docker exec -it 19781c1232b6 /bin/bash
[root@19781c1232b6 /]# yum install -y net-tools
② 自定义网络(手动指定固定IP)
创建一个子网段的命名空间,自定义一个网络命名空间
创建容器选择自己定义的网络命名空间mynetwork,指定固定IP
[root@localhost ~]#docker run -itd --name test2 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
登录容器查看IP
[root@localhost ~]# docker exec -it 9c33f88df086 /bin/bash
[root@19781c1232b6 /]# yum install -y net-tools
二、CPU资源控制
1、CPU使用率上限控制
#进入目录
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker
查看cpu.cfs_quota_us 文件,可以看到一个参数值
参数值 -1 :表示cpu使用资源不受限制
这种情况是不合理的,影响非常严重,所以需要做限制不合理原因:
①一个节点服务器有多个容器,一个容器占用率高,其他容器资源不够使用
②比如这一个容器受到攻击,可以直接使服务器瘫痪cpu周期为1s 参数值为100000 假如要使用cpu配比为20%,设置参数值为20000即可。1s为100000,0.2s 20000
参数限定有两种方式:
① 创建容器时直接设定好(–cpu-quota)
在Docker中可以通过–cpu-quota选项来限制CPU的使用率
② 更改配置文件
修改对应的Cgroup配置文件/sys/cgroup/cpu/docker/容器编号/cpu.cfs_quota_us 参数值来实现,直接使用echo将值导入此文件中即可生效
示例:创建容器时设定
#创建容器
[root@localhost ~]# docker run -itd --name test3 --cpu-quota 20000 centos:7 /bin/bash
#进入容器进行压力测试
[root@54bbe1f49f76 /]# yum install bc -y #安装压测工具
[root@54bbe1 f49f76/]# echo "scale=5000;4* a(1)" | bc -l -q #计算圆周率的压测公式
解释:
计算圆周率的压测公式
scale=5000,小数点后面的5000位。a是bc的一个内置函数,代表反正切arctan ,由于tan(pi/4) = 1,于是4*arctan(1) = pi -l使用标准数学库 -q不输出在界面
2、多任务按比例分享CPU
当有多个容器任务运行时,很难计算CPU的使用率。为了使容器合理使用CPU资源,可以通过–cpu-share选项来设置CPU按比例共享资源,这种方式还可以实现CPU使用率的动态调整,灵活性大大增加
如:运行两个容器,设置容器的权重,使得c1和c2的CPU资源占比为33.3%和66.7%,(1 : 2)
权重解释:
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7比如两个容器,比例整合在一起,c1占512为1/3,c2占1024为2/3,这种就叫做权重,灵活性大大增加
如果再增加一个容器
docker run -itd --name c3 --cpu-shares 1024 centos:7
c1占512为1/5,c2占1024为2/5,c3占1024为2/5 (1 : 2 : 2)
① 创建容器
[root@localhost ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
[root@localhost ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
② 压力测试
#进入容器并安装压测工具(两个容器均操作)
[root@8f2682289344 /]# yum install -y epel-release
[root@8f2682289344 /]# yum install stress -y
#压测,产生四个CPU线程使其满载(两个容器同时操作)
[ root@5ed79616b34c /]# stress -c 4
#验证结果
重新打开终端,使用docker stats查看每个容器的资源使用情况
3、限制容器使用指定的CPU内核
在Docker中可以使用–cpuset-cpus选项来使某些程序独享CPU内核,以便提高其处理速度,选项后直接跟参数0,1,2,3……表示第1个内核,第二个内核,第三个内核,第四个内核……,与/rpoc/cpuinfo中的CPU编号(processor)相同。
对应的Cgroup配置文件/sys/fs/cgroup/cpuset/docker/容器编号/cpuset.cpus。
使用top命令按1查看
① 创建容器并指定使用CPU内核
只使用第二个(CPU1)和第四个(CPU3)核心数资源
[root@localhost ~]# docker run -itd --name test4 --cpuset-cpus 1,3 centos:7 /bin/bash
② 压力测试
#进入容器并安装压测工具
[root@e504d80ff6e1 /]# yum install -y epel-release
[root@e504d80ff6e1 /]# yum install stress -y
#压测,产生四个CPU线程使其满载(两个容器同时操作)
[root@e504d80ff6e1 /]# stress -c 4
#验证结果
重新打开终端,使用top命令按1查看
以上CPU资源管控可以同时使用
三、内存资源控制
内存使用就是设置交换分区的上限值。可以使用docker run -m命令来限制容器内存使用量。
相应的Cgroup配置文件为/sys/fs/cgroup/memory/memory.limit_in_bytes
注意:一旦容器Cgroup使用的内存操过了限制的容量,Linux内核将会尝试收回这些内存,如果仍旧没法控制内存使用在限制范围之内,进程将会被杀死
1、创建容器并限制内存使用
#限制容器内存为512M
[root@localhost ~]# docker run -itd --name test5 -m 512m centos:7
2、验证
#进入容器并安装压测工具
[root@fa2c219eb994 /]# yum install -y epel-release
[root@fa2c219eb994 /]# yum install stress -y
##压测
[root@fa2c219eb994 /J]# stress -m 1204m --vm 2
#验证结果
重新打开终端,使用docker stats命令查看
[root@localhost~] # docker stats
不使用压测,也可直接使用docker stats命令查看LIMIT上限值设定为512M
四、IO资源控制
如果是在一台服务器上进行容器的混合部署,那么会出现同时有几个程序写磁盘数据的情况,这时可以通过–device-write-iops选项来限制写入的iops,相应的还有–device-read-bps选项可以限制读取的iops。但是这种方法只能针对blkio限制的设备(device),而不是分区
- bps是byte per second的简写,意思是每秒读写的数据量
- iops是io per second的简写,意思是每秒IO的次数
blkio限制示例
① 限制读某个设备的bps (数据量):–device-read-bps:
例: docker run -itd --name blkio1 --device-read-bps /dev/sda:30M centos:7 /bin/bash
② 限制写入某个设备的bps (数据量):–device-write-bps
例: docker run -itd --name blkio2 --device-write-bps /dev/sda:30M centos:7 /bin/bash
③ 限制读某个设备的iops (次数):–device-read-iops
④ 限制写入某个设备的iops (次数):–device-write-iops