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