吊死扶伤网

3.3Docker网络模式与资源控制

3.3Docker网络模式与资源控制

Docker网络模式与数据卷

一.网络模式

1.1Host模式

  • host容器将不会虚拟出自己的网络网卡,配置自己的模式IP等,而是资源使用宿主机的IP和端口范围。如果启动容器的控制时候使用host模式,那么这个容器将不会获得一个独立的网络 NetworkNamespace,而是模式和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的资源网卡,配置自己的控制IP等,而是网络使用宿主机的IP和端口。但是模式,容器的资源其他方面,如文件系统、控制进程列表等还是网络和宿主机隔离的。
  • 使用host模式的模式容器可以直接使用宿主机的Ip地址与外界通信,容器内部的资源服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost 上已经使用的端口就不能再用了,网络的隔离性不好。
  • 解决了ip地址不固定的情况

image-20220906135127596

1.2 Container模式

  • 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围(端口不能一致),只有一个容器有自己的网卡,出去还是docker0进行通讯
  • 有点像各个服务放在同一个宿主机上面这种情况
  • 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信

image-20220906135304452

docker run -itd --name test1 centos:7 /bin/bash#--name选项可以给容器创建一个自定义名称docker ps -adocker inspect -f '{ { .State.Pid}}' 3ed82355f811 	#查看容器进程号ls -l /proc/25495/ns 	#查看容器的进程、网络、文件系统等命名空间编号docker run -itd --name test2 --net=containet:3ed82355f811 centos:7 /bin/bashdocker ps -adocker inspect -f '{ { .State.Pid}}' ff96bc43dd271s-1/proc/27123/ns#查看可以发现两个容器的net namespace编号相同

1.3 None模式

  • 该模式关闭了容器的网络功能
  • 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
  • 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性,可以安全的储存数据,不会被攻击,可以用来当个仓库
    image-20220906135623567

1.4 Bridge模式

  • 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
  • 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看
  • bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看
    image-20220906135733198

overlay模式
叠加式网络模式,使用外部的服务组件作为网关或者代理,例如ingress ,一般和docker-swarm结合(所以建议以了解的角度来介绍)

image-20220906142013326

1.5 自定义网络

#查看网络模式列表docker network ls#查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)docker inspect 容器ID

image-20220906140812619

#指定分配容器IP地址#直接使用bridge模式,是无法支持指定IP运行docker的docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash

image-20220906143005756

报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个

#创建自定义网络#可以先自定义网络,再使用指定IP运行dockerdocker network create --subnet=172.19.0.0/16 --opt "com.docker.network.bridge.name"="docker2" xjw

image-20220906163254302

docker2为执行ifconfig命令时,显示的网卡名。如果不使用–opt参数指定此名称,那你在使用ifconfig命令查看网络信息时,看到的是类似br-110eb56a0b22这样的名字。

xjw为执行docker network list命令时,显示的网络模式名称。

#检查网络docker network inspect xjw 	#将容器添加到网络docker run -itd --name test --net xjw --ip 172.19.0.10 centos:7 /bin/bashdocker network inspect xjw

image-20220906163910474image-20220906165645813

二.资源控制Cgroup

1.CPU资源控制

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控进程启停等等。所cgroups(Control groups)实现了对资源的配额和度量。

cgroups有四大功能:

功能说明
资源限制对任务使用的资源总额进行限制
优先级分配通过分配的CPU时间片数以及磁盘io带宽大小,相当于控制任务运行优先级
资源统计统计系统的资源使用量,如cpu时长,内存用量等
任务控制cgroup可以对任务执行挂起、恢复等操作

设置CPU使用率上限

Linux通过CFS(Completely Fair
Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。

可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。
使用–cpu-period即可设置调度周期,
使用–cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS周期的有效范围是1ms1s,对应的–cpu-period的数值范围是10001000000。
而容器的CPU配额必须不小于1ms,即–cpu-quota的值必须>=1000.

#查看CPU使用率docker run -itd --name test1 centos:7 /bin/bashcd /sys/fs/cgroup/cpu/docker/05d8e984eab7c53d82b2b4fe889bed11963170c6774c2f8507fe0a7166c9f46b/cat cpu.cfs_quota_uscat cpu.cfs_period_us

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VV69tJEi-1663301322695)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906183154931.png)]

cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用us表示),默认为100000。

cpu.cfs_quota_us:表示该cgroup限制占用的时间(微秒),默认为-1,表示不限制。
如果设为50000,表示占用50000/100000=50%的cpu。

#进行CPU压力测试docker exec -it 05d8e984eab7 /bin/bash#需要先yum install -y vimvim /cpu.sh#!/bin/bashi=0while truedolet i++donechmod +x /cpu.sh./cpu.shtop 	#可以看到这个脚本占了很多的cpu资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BzWBobOU-1663301322696)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906184329261.png)]

#设置CPU使用率#设置50%的比例分配CPU使用时间上限docker run-itd--name test2--cpu-quota 50000 centos:7/bin/bash	#可以重新创建一个容器并设置限额或者cd /sys/fs/cgroup/cpu/docker/05d8e984eab7c53d82b2b4fe889bed11963170c6774c2f8507fe0a7166c9f46b/echo 50000 >cpu.cfs_quota_usdocker exec -it 05d8e984eab7 /bin/bash./cpu.shtop#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNTUIs1Y-1663301322696)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906185136180.png)]

设置CPU资源占用比(设置多个容器时才有效)

Docker 通过–cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。

#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。docker run -itd --name c1 --cpu-shares 512 centos:7	docker run -itd --name c2 --cpu-shares 1024 centos:7#分别进入容器,进行压力测试docker exec -it a5f30bf4b164 /bin/bashyum install -y epel-releaseyum install stress -ystress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根#查看容器运行状态(动态更新)docker stats

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROEQz5m2-1663301322697)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906191725337.png)]

设置容器绑定指定的CPU

#先分配虚拟机4个CPU核数docker run -itd --name test3 --cpuset-cpus 1,3 centos:7 /bin/bash#进入容器,进行压力测试yum install -y epel-releaseyum install stress -ystress -c 4#退出容器,执行 top 命令再按 1 查看CPU使用情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4qNP8SY-1663301322697)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220906192345117.png)]

2.对内存使用的限制

docker run -itd --name test4 -m 512m centos:7 /bin/bashdocker stats

限制可用的swap大小,–memory-swap
强调一下,–memory-swap是必须要与–memory一起使用的。
正常情况下,–memory-swap的值包含容器可用内存和可用swap.
所以-m 300m --memory-swap=1g的含义为:容器可以使用300M的物理内存并且可以使用700M(1G-300)的swap。
如果–memory-swap设置为0或者不设置,则容器可以使用的swap
大小为-m值的两倍。
如果–memory–swap的值和-m值相同,则容器不能使用swap。
如果-memory-swap值为-1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap容器就可以使用多少)。

image-20220907094326016

3.对磁盘IO配额控制(blkio)的限制

#限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。--device-read-bps 	例:docker run -itd --name test5 --device-read-bps /dev/sda:1M  centos:7 /bin/bash#限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。--device-write-bps 	例:docker run -itd --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash#限制读某个设备的iops(次数)--device-read-iops	#限制写入某个设备的iops(次数)--device-write-iops		#创建容器,并限制写速度docker run -it --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash#通过dd来验证写速度dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct	#添加oflag参数以规避掉文件系统cache(直接写入磁盘)10+0 records in10+0 records out10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s#清理docker占用的磁盘空间docker system prune -a#可以用于清理滋盘,删除关闭的容器、无用的数据卷和网络

三. 端口映射

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了
端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

选项参数
-P随机端口 (从49153到65535,每次新建容器端口号自加一)
-p自定义端口 ( 宿主机端口:容器内端口 )
#自定义端口docker run -itd --name test1 -p 8081:80 nginx#需要在容器中开启nginxdocker exec -it 72e1adbbda21#在网页测试http://192.168.48.14:8081#随机端口docker run -d --name test -P nginxdocker run -itd -P nginx:latest /bin/bash

端口:容器内端口 ) |

#自定义端口docker run -itd --name test1 -p 8081:80 nginx#需要在容器中开启nginxdocker exec -it 72e1adbbda21#在网页测试http://192.168.48.14:8081#随机端口docker run -d --name test -P nginxdocker run -itd -P nginx:latest /bin/bash

未经允许不得转载:吊死扶伤网 » 3.3Docker网络模式与资源控制