容器与容器云——Docker容器资源管控

Docker对网络资源的控制

docker network ls		#查看docker网络信息

[root@192 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2e0728405ba4        bridge              bridge              local
e0ce1ddab7c2        host                host                local
c5cf962b5b57        none                null                local

docker0 虚拟容器网关 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255

安装docker时,它会自动创建3个网络,bridge(创建容器默认连接到此网络)、none、host
  • none:该模式关闭了容器的网络功能

  • host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口

  • bridge:(最常见的模式,也是默认的network网络形式)此模式会为每一个容器分配、设置IP等,并将容器连接到一个 docker0 虚拟网桥以及Iptables nat(iptables做了一个nat地址转换)表配置与宿主机通信。

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

以上都是不用动手的,真正需要配置的是自定义网络

桥接

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

[root@192 ~]# docker run -itd --name test1 --network bridge --ip 172.17.0.100 centos:7 /bin/bash
......省略内容
docker: Error response from daemon: user specified IP address is supported on user defined networks only.

会发现使用bridge无法支持自定义IP

自定义网络固定IP(类似创建一个子网段)
docker network create --subnet=172.18.0.0/16 mynetwork
docker run -itd --name test2 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash

[root@192 ~]# docker run -itd --name test2 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash
5ee683954f3e38cd904bc74e4f69082c00b95d87e6b69de55123d92fac4af28b
[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5ee683954f3e        centos:7            "/bin/bash"         7 seconds ago       Up 5 seconds                            test2

[root@192 ~]# docker exec -it 5ee683954f3e /bin/bash
[root@5ee683954f3e /]# 

进入容器,要想使用 ifconfig 命令查询IP,安装 net-tools 工具
yum -y install net-tools

Docker从3个维度对进行资源管控,每个容器相当于一个进程,cpu、内存、I/O来进行分配资源

  • CPU
  • 内存
  • 数据流方向的I/O读写
CPU使用率控制

进入docker目录查看cpu资源目录

cd /sys/fs/cgroup/cpu/docker/

[root@192 ~]# cd /sys/fs/cgroup/cpu/
[root@192 cpu]# cd docker/
[root@192 docker]# ls
5ee683954f3e38cd904bc74e4f69082c00b95d87e6b69de55123d92fac4af28b   #镜像(container)ID
……省略内容
[root@192 docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5ee683954f3e        centos:7            "/bin/bash"         2 hours ago         Up 2 hours                              test2

进入镜像查看cpu.cfs_quota_us文件数值

[root@192 docker]# cd 5ee683954f3e38cd904bc74e4f69082c00b95d87e6b69de55123d92fac4af28b
[root@192 5ee683954f3e38cd904bc74e4f69082c00b95d87e6b69de55123d92fac4af28b]# ls
cgroup.clone_children  cpuacct.stat          cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release
cgroup.event_control   cpuacct.usage         cpu.cfs_quota_us   cpu.shares         tasks
cgroup.procs           cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat
[root@192 5ee683954f3e38cd904bc74e4f69082c00b95d87e6b69de55123d92fac4af28b]# cat cpu.cfs_quota_us 
-1

cpu.cfs_quota_us = -1  #cpu配额,默认值是-1,表示容器能使用的资源是不受限制的

CPU的周期 以 1s 秒为周期定律,参数值为 100000
如果需要cpu使用容器资源分配率为 20% 左右,参数值为 20000 ,相当于一个周期分配给这个容器资源的 0.2s 秒
cpu是按照时间周期来进行分配的,在一个时刻只会给一个进程分配资源

按cpu使用率限制设置有两种方法
  • 可以在容器创建时加入cpu参数设置,最高资源占用率为20%
[root@192 ~]# docker run -itd --name test3 --cpu-quota 20000 centos:7 /bin/bash
[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
5bd0371c6da5        centos:7            "/bin/bash"         About a minute ago   Up 10 seconds                           test3
5ee683954f3e        centos:7            "/bin/bash"         3 hours ago          Up 3 hours                              test2

压力测试,进入要测试的容器安装 bc 工具

[root@5bd0371c6da5 /]# yum -y install bc  

[root@5bd0371c6da5 /]# echo "scale=5000;4*a(1)" | bc -l -q		#执行圆周率显示小数点后5000位的计算

再打开一个终端,用 top 实时测试动态数据
容器与容器云——Docker容器资源管控_第1张图片
可以看出,cpu资源使用率在满载的情况下,在20%左右

  • 直接修改指定容器里 cpu.cfs_quota_us 文件
[root@docker 5bd0371c6da57f568a68b07d1e440a41d2c12a5ae6d4db1acb3128a47c39065d]# echo "20000" > 5bd0371c6da57f568a68b07d1e440a41d2c12a5ae6d4db1acb3128a47c39065d/cpu.cfs_quota_us
按容器权重比例分配设置

创建两个容器为 c1 和 c2 ,若只有这两个容器,设置容器的权重,是的 c1 和 c2 的 cpu 资源占比为 33.3 % 和 66.7%
cpu_shares 为权重文件
优点:灵活性大大增加,根据设置的总和值来进行分配

[root@192 docker]# docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash
480771c0c89c8eb1215f7f7f283fe78aa55159a245aa1ecd4a592426f644a455
[root@192 docker]# docker run -itd --name c2 --cpu-shares 1024 centos:7 /bin/bash
a1bbc1e12782103f737964e41eabd928bf2e9bbd10e89b2bf004dda7a2c6c6c2

分别进入容器安装 epel-release、stress 压测工具

[root@192 docker]# docker exec -it 480771c0c89c /bin/bash
[root@480771c0c89c /]# yum install epel-release -y
[root@480771c0c89c /]# yum -y install stress

测试

用 stress -c 4 命令来进行测试									#产生4个cpu线程

[root@480771c0c89c /]# stress -c 4						#c1
stress: info: [101] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

[root@a1bbc1e12782 /]# stress -c 4						#c2
stress: info: [99] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

容器与容器云——Docker容器资源管控_第2张图片

指定cpu的使用限制容器

之前创建的容器太多,用 docker ps -a | awk ‘{print "docker rm "$1}’ | bash 命令进行批量删除

[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
a1bbc1e12782        centos:7            "/bin/bash"         22 minutes ago      Exited (137) About a minute ago                       c2
480771c0c89c        centos:7            "/bin/bash"         23 minutes ago      Exited (137) About a minute ago                       c1
5bd0371c6da5        centos:7            "/bin/bash"         About an hour ago   Exited (137) About a minute ago                       test3
5ee683954f3e        centos:7            "/bin/bash"         4 hours ago         Exited (137) About a minute ago                       test2
[root@192 ~]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
a1bbc1e12782
480771c0c89c
5bd0371c6da5
5ee683954f3e
[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@192 ~]# 

只使用cpu1和cpu3,在 cpuset-cpus 指定
[root@192 ~]# docker run -itd --name test1 --cpuset-cpus 1,3 centos:7 /bin/bash
e8b77e45066fed7fdb7b9159270feff29ca702c421e081f36a7fb95cf094e336

进入容器,安装压测工具

[root@192 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e8b77e45066f        centos:7            "/bin/bash"         42 seconds ago      Up 41 seconds                           test1
[root@192 ~]# docker exec -it e8b77e45066f /bin/bash
[root@e8b77e45066f /]# yum -y install epel-release
[root@e8b77e45066f /]# yum -y install stress

用 stress -c 4 命令来进行测试

[root@e8b77e45066f /]# stress -c 4
stress: info: [98] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

打开另一个终端,使用 top 命令 按1 显示cpu数量详细动态数据状态查看
容器与容器云——Docker容器资源管控_第3张图片

内存使用限制
[root@192 ~]# docker run -itd --name test02 -m 512m centos:7 /bin/bash
ca910192d6046bb9243be070487511312db02c233f5ba8fb2d49cf5d28099cfa

在这里插入图片描述

对读写 I/O 的限制

控制读写数据量
读出数据用 --device-read-bps 限制读某个设备的bps
写入数据用 --device-write-bps 限制写入某特设备的bps

docker run -itd --device-read-bps /dev/sda:20M centos:7 /bin/bash

docker run -itd --device-write-bps /dev/sda:20M centos:7 /bin/bash

控制读写次数
读出数据用 --device-read-iops 限制读某个设备的bps
写入数据用 --device-write-iops 限制写入某特设备的bps

docker run -itd --device-read-iops /dev/sda:20M centos:7 /bin/bash
docker run -itd --device-write-iops /dev/sda:20M centos:7 /bin/bash

你可能感兴趣的:(Docker容器)