容器與容器雲——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 實時測試動態數據
在這裏插入圖片描述
可以看出,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

在這裏插入圖片描述

指定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數量詳細動態數據狀態查看
在這裏插入圖片描述

內存使用限制
[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章