Docker---网路及资源控制

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

在这里插入图片描述

扫描二维码关注公众号,回复: 11154434 查看本文章
把之前关机前所创建的容器全部删除
[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

在这里插入图片描述

I/O读写:

在这里插入图片描述

原创文章 84 获赞 95 访问量 5892

猜你喜欢

转载自blog.csdn.net/obsessiveY/article/details/105623508