Docker—网路及资源控制
一.docker网络分析
用ifconfig查看docker的网卡:
[root@localhost docker]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:1c:cd:35:79 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
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.131 netmask 255.255.255.0 broadcast 192.168.88.255
inet6 fe80::ad7:30c6:71e0:cbb7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ba:fb:34 txqueuelen 1000 (Ethernet)
RX packets 707705 bytes 1046054222 (997.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 135855 bytes 8488461 (8.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 64 bytes 5568 (5.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 64 bytes 5568 (5.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:d3:bd:16 txqueuelen 1000 (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
1.其中eth0是真实存在的适配器,用来连接物理机网卡;
2.而lo则是虚拟出来的回环网卡,用来检测tcp/ip协议是否生效;2.
3.对于virbr0虚拟桥接网卡,linux自身集成了一个虚拟化功能,被镶嵌在内核当中
4.docker0网卡:
docker使用linux桥接,在宿主机虚拟一个容器网——docker 0,Docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP。
同时Docker网桥也是每个容器的默认网关。因为在同一个宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射)。
启动docker 0和ens33之间通过NAT地址转换技术,使得后面的容器IP映射到ens33的地址,再通过不同的端口映射区分不同的容器。
二.docker四种网络模式
安装Docker时,会自动创建三个网络:bridge(创建容器默认连接到此网络)、 none 、host。
[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
dcd22a239ede bridge bridge local
05fb60d14dc2 host host local
00efca688725 none null local
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network NameSpace,而是和宿主机共用一个Network NameSpace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口可以使用宿主机的端口,不需要要进行NAT,Host的最大的优势就是网络性能比较好,但是docker host上已经使用的端口,就不能再用了,网络的隔离性不好。
container模式
container模式指定新创建的容器和已经存在的容器共享一个Network NameSpace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP地址,而是和指定的一个容器共享IP地址、端口范围。
none模式
该模式关闭了网络功能
Bridge模式:
在搭建好docker之后,通过ip add 或者 ifconfig命令就可以查看到,虚拟出一块叫做docker 0的一块网卡。 作为docker的默认网络模式,即bridge模式。其中的所有容器将docker0作为网关,这样就能与外界进行通信。
bridge模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上 。通过docker0网桥以及iptables nat表配置与宿主机通信。
三.docker网络命令
bridge网络下指定IP:
当我们使用如下命令,创建一个bridge网络下的指定IP地址的容器时,会发现使用bridge无法支持指定IP:
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
此时,不去指定IP即可:
docker run -itd --name test1 --network bridge centos:7 /bin/bash
如下:
[root@localhost docker]# docker run -itd --name test1 --network bridge centos:7 /bin/bash
a4d958311145ca8de6a6caff452751ec83df101bd4a069b4de0364c4bc596114
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4d958311145 centos:7 "/bin/bash" 29 seconds ago Up 28 seconds test1
[root@localhost docker]# docker exec -it a4d958311145 /bin/bash
[root@a4d958311145 /]#
查看网卡:
[root@a4d958311145 /]# yum install net-tools -y
[root@a4d958311145 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 2875 bytes 15081634 (14.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2675 bytes 147698 (144.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
自定义网络固定IP:
先创建网桥:
[root@localhost docker]# docker network create --subnet=172.18.0.0/16 mynetwork
8ecd57453a3f94077ed992b367eb2a3bc846ab23aa9362a436174c4a9da66768
[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
dcd22a239ede bridge bridge local
05fb60d14dc2 host host local
8ecd57453a3f mynetwork bridge local
00efca688725 none null local
再去指定IP:
[root@localhost docker]# docker run -itd --name test2 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash
f2baddc5971f716f9db58b20956cf406a4ba31e06749aaf0f173827b493b0e8b
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2baddc5971f centos:7 "/bin/bash" 25 seconds ago Up 24 seconds test2
a4d958311145 centos:7 "/bin/bash" 19 minutes ago Up 19 minutes test1
四.资源控制
查看CPU使用率:
[root@localhost docker]# cd /sys/fs/cgroup/cpu/docker
[root@localhost docker]# ls
a4d958311145ca8de6a6caff452751ec83df101bd4a069b4de0364c4bc596114
cgroup.clone_children
cgroup.event_control
cgroup.procs
cpuacct.stat
cpuacct.usage
cpuacct.usage_percpu
cpu.cfs_period_us
cpu.cfs_quota_us
cpu.rt_period_us
cpu.rt_runtime_us
cpu.shares
cpu.stat
f2baddc5971f716f9db58b20956cf406a4ba31e06749aaf0f173827b493b0e8b
notify_on_release
tasks
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2baddc5971f centos:7 "/bin/bash" 6 minutes ago Up 6 minutes test2
a4d958311145 centos:7 "/bin/bash" 25 minutes ago Up 25 minutes test1
[root@localhost docker]# cd f2baddc5971f716f9db58b20956cf406a4ba31e06749aaf0f173827b493b0e8b/
[root@localhost f2baddc5971f716f9db58b20956cf406a4ba31e06749aaf0f173827b493b0e8b]# cat cpu.cfs_quota_us
-1
(-1为不受限制)
限定CPU不超过20%:(CPU进程数为100000,那么CPU的20%为20000)
[root@localhost ~]# docker run -itd --name test3 --cpu-quota 20000 centos:7 /bin/bash
73df43d59c4ddab02a726f6242e42d22e56ed3f3657a826a237f9673f11e3f2c
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73df43d59c4d centos:7 "/bin/bash" 20 seconds ago Up 19 seconds test3
f2baddc5971f centos:7 "/bin/bash" 13 minutes ago Up 13 minutes test2
a4d958311145 centos:7 "/bin/bash" 32 minutes ago Up 32 minutes test1
压力测试:
安装压测软件:
[root@localhost ~]# docker exec -it 73df43d59c4d /bin/bash
[root@73df43d59c4d /]# yum install bc -y
压测:
[root@73df43d59c4d /]# echo "scale=5000; 4*a(1)" | bc -l -q
按比例分配CPU资源:
[root@localhost ~]# docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash
cc56db6439fbebb287776f4e70763f18b4a66a53491784e71a1a3bb32e7dc0d0
[root@localhost ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7 /bin/bash
792acc46ccd23fe99f2f5e2931bec24409d03789afc30838fb6ff01864264dd4
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
792acc46ccd2 centos:7 "/bin/bash" 6 seconds ago Up 5 seconds c2
cc56db6439fb centos:7 "/bin/bash" 28 seconds ago Up 28 seconds c1
进入容器:
[root@localhost ~]# docker exec -it cc56db6439fb /bin/bash
[root@cc56db6439fb /]# yum install -y epel-release
[root@cc56db6439fb /]# yum install stress -y
[root@cc56db6439fb /]# stress -c 4
指定CPU使用:
关机添加内核为4
把之前关机前所创建的容器全部删除
[root@localhost ~]# docker ps -a | awk '{print "docker rm "$1}'|bash
指定第二个和第四个核心运行
[root@localhost ~]# docker run -itd --name test1 --cpuset-cpus 1,3 centos:7
进入容器:
[root@localhost ~]# docker exec -it 859cd98821f0 /bin/bash
下载压测工具:并查看:
[root@859cd98821f0 /]# yum install -y epel-release
[root@859cd98821f0 /]# yum install stress -y
[root@859cd98821f0 /]# stress -c 4
内存使用限制:
[root@localhost ~]# docker run -itd --name test2 -m 512m centos:7 /bin/bash
[root@localhost ~]# docker stats