docker--资源控制

概述

​ 由于一台主机放多个容器,默认情况下,docker 没有对容器镜像硬件资源做限制,当容器负载过高的时候会占用宿主机的资源,所以需要对容器的资源设置一个上限,可以从网络资源,CPU,I/O,内存这些方面来进行限制。

一、网络资源控制

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络),none,host.

host (仅主机模式):容器将不会虚拟自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

​ 优势:网络性能比较好,但是网络的隔离性不好

Container(容器模式):创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围

None:该模式关闭了容器的网络功能。

Bridge (桥接模式):此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker 0 虚拟网桥,通过docker 0 网桥以及IPtable nat表配置与宿主机通信。

网络资源管理命令

【1】查看网络模式

docker network ls

【2】使用桥接模式创建

docker run -itd --name test1 --network bridge --ip 127.17.0.10 centos:7 /bin/bash

//会发现使用bridge无法支持指定IP
// 可以生成镜像和容器 但是无法开启容器
// 如果不加 --ip IP地址 是可以生成容器和镜像的 容器是启动状态
//进容器 发现没有IP地址 可以先装一个 yum install net-tools -y,在查询IP地址 就是发现有一个

【3】自定义网络IP

docker network create --subnet=网段/24 名字

docker network create --subnet=172.18.0.0/16 mynetwork
//最后的mynetwork可以按个人喜欢命名

给容器test3固定mynetwork的网段IP地址
docker run -itd --name test3 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

二、CPU使用率

cd /sys/fs/cgroup/cpu/docker/ 可以看到所有容器的信息。

【1】限定CPU使用超过20%

CPU进程数为100000,那么CPU的20%为20000

cpu-quota:指定cpu的使用上限的百分比

docker run -itd --name test1 --cpu-quota 20000 centos:7 /bin/bash
-i:表示输入   -t:表示绑定终端
或者
echo 20000 > /sys/fs/cgroup/cpu/docker/容器ID号/cpu.cfs_quota_us

【2】按比例分配CPU

cpu-shares: cpu资源提供一组容器使用,组内的容器按比例使用cpu资源,cpu资源被负载打的容器占用(按照压缩比例分配),当空闲进行运行起来时,cpu资源会被分配到其他容器

创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为33.3%和66.7%

docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7

验证:分别进入容器中,安装两个软件

yum install epel-release -y
yum install stress -y
stress -c 4  //产生四个CPU线程

在另外一个终端页面验证CPU百分比,可以看看到c2的cpu是c1的两倍

docker stats 
//可以看到容器的百分比

【3】限制容器使用指定的CPU

cpuset-cpus:指定容器只能运行在那个cpu核心上(绑定cpu);核心使用0,1,2,3编号

docker run -itd --name test2 --cpuset-cpus 1,3 centos:7 /bin/bash

//进容器,安装软件
yum install epel-release -y
yum install stress -y
stress -c 4  //产生四个CPU线程

//验证方法:
//开启另一个终端输入:top 按 1 检查

【4】内存使用限制

docker run -itd --name test3 -m 512m centos:7

验证:
另一个终端查看容器状态 docker stats

【5】磁盘I/O读写优化

--device-read-bps:限制读某个设备的bps(数据量) 
列:docker run -d --device-read-bps /dev/sda:30M centos:7

--device-write-bps:限制写入某个设备的bos(数据量)
列:docker run -d --device-write-bps /dev/sda:30M centos:7

--device-read-iops:限制读某个设备的iops(次数)

--device-write-iops:限制写入某个设备的iops(次数)