Docker網絡、資源控制

Docker網絡
在創建安裝完docker後,使用,查看網卡信息,會出現一個docker的默認虛擬容器網關docker 0,通過橋接的方式,與宿主機的網卡進行通信。在創建容器後,虛擬容器網關docker 0會分配一個IP地址給容器,該網關下的容器,通過分配的IP地址進行通信,與外界網絡通信時,通過映射容器的端口到宿主機,外界訪問容器時,通過宿主機的IP地址+端口號進行訪問,不同的docker網絡之間屬於不同的namespace,與宿主機網卡橋接

[root@docker ~]# ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:c9:35:4c:f8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看docker的網絡信息

[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5480e1cefc97        bridge              bridge              local
977198fa3d32        host                host                local
ff3274efbced        none                null                local

Docker網絡、資源控制

安裝docker時,它會自動創建三個網絡,,bridge(創建容器默認連接到此網絡)、node、host
(1)Host:容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口
(2)Node:該模式關閉了容器的網絡功能
(3)Bridge:此模式會爲每一個容器分配、設置IP等,並將容器連接到docker 0虛擬網橋,通過docker 0以及Iptables NAT表配置與宿主機通信
以上都是不用動手的,真正需要配置的是自定義網絡
Docker網絡、資源控制
Docker網絡、資源控制
常用指令
Docker網絡、資源控制
1、創建橋接網絡

#使用bridge網絡時,是無法指定對應的IP的
#下面的創建容器的操作語句是無法成功執行的
[root@docker ~]# docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#正確的方法
[root@docker ~]# docker run -itd --name test1 --network bridge centos:7 /bin/bash
[root@docker ~]# docker exec -it 7cf1e1134a9e /bin/bash
[root@7cf1e1134a9e /]# ifconfig    //進入容器查看自動分配IP地址
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 2695  bytes 15070315 (14.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2544  bytes 140980 (137.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2、自定義網絡

#創建網絡
[root@docker ~]# docker network create --subnet=172.18.0.0/24 mynetwork
[root@docker ~]#  ifconfig  //宿主機可直接查看到創建的虛擬網卡的信息
br-9f77b8941dc3: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 02:42:20:72:5c:d7  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#創建容器網絡爲自定義網絡
[root@docker ~]# docker run -itd --name test2 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash
[root@docker ~]# docker exec -it ed2fd28fe04c /bin/bash
[root@ed2fd28fe04c /]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.10  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe12:a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:12:00:0a  txqueuelen 0  (Ethernet)
        RX packets 3359  bytes 15102531 (14.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3151  bytes 173627 (169.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

CPU、內存、IO資源控制
1、CPU使用率控制

#查看指定網卡的使用率
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us 
#設置20%的限定
[root@docker ~]# docker run -itd --name test1 --cpu-quota 20000 centos:7 /bin/bash
或者設置已存在的容器CPU
[root@docker ~]# echo 20000 > /sys/fs/cgroup/cpu/容器ID/cpu.cfs_quota_us

2、容器CPU壓力測試(在容器內)

[root@3b12b7cb2f2c /]# yum install bc -y
[root@3b12b7cb2f2c /]# echo "scale=5000; 4*a(1)" | bc -l -q
#打開新的終端,在宿主機使用top命令查看CPU使用情況

名詞解釋
a是bc的一個內置函數,代表反正切arctan,由於tan(pi/4)=1,於是4*arctan(1)=pi
-l:使用標準數學庫
-q:不輸出在界面

3、按比例分配CPU.

#創建兩個容器爲c1和c2,若只有這兩個容器,設置容器的權重,使得c1和c2的CPU資源佔比爲33.3%和66.7%
[root@docker ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
[root@docker ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
#分別進容器
[root@9ac3a10deb01 /]# yum install epel-release -y
[root@9ac3a10deb01 /]# yum install stress -y
[root@9ac3a10deb01 /]# stress -c 4  //產生四個CPU線程
#驗證結果
[root@docker ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
311d1565d5bd        c2                  65.81%              988KiB / 1.938GiB   0.05%               23.2MB / 261kB      0B / 0B             7
9ac3a10deb01        c1                  33.03%              984KiB / 1.938GiB   0.05%               23.3MB / 340kB      0B / 0B             7

4、限制容器使用指定的CPU

[root@docker ~]# docker run -itd --name test2 --cpuset-cpus 1,3 centos:7 /bin/bash
//驗證方法:壓測容器,使用top命令,按1檢查
[root@docker ~]# top
top - 18:05:05 up 11 min,  2 users,  load average: 1.20, 0.30, 0.12
Tasks: 174 total,   5 running, 169 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

5、內存使用限制

[root@docker ~]# docker run -itd --name test3 -m 512m centos:7
#驗證
[root@65b7a836429f /]# stress -m 1024m --vm 2
[root@docker ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
65b7a836429f        test3               201.46%             198.1MiB / 512MiB   38.69%              23.3MB / 327kB      0B / 0B             5

6、對blkio的限制
--device-read-bps:限制讀某個設備的bps(數據量)
例:docker run -d --device-read-bps /dev/sda:30 centos:7
--device-write-bps:限制寫入某個設備的bps(數據量)
例:docker run -d --device-write-bps /dev/sda:30 centos:7
--device-read-iops:限制讀某個設備的iops(次數)
--device-write-iops:限制寫入某個設備的iops(次數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章