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