• 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 -a
    
    docker inspect -f '{{.State.Pid}}' 3ed82355f811 	#查看容器进程号
    ls -l /proc/25495/ns 	#查看容器的进程、网络、文件系统等命名空间编号
    
    docker run -itd --name test2 --net=containet:3ed82355f811 centos:7 /bin/bash
    docker ps -a
    
    docker inspect -f '{{.State.Pid}}' ff96bc43dd27
    
    1s-1/proc/27123/ns
    #查看可以发现两个容器的net namespace编号相同
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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
    
    • 1
    • 2
    • 3
    • 4

    image-20220906140812619

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

    image-20220906143005756

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

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

    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/bash
    docker network inspect xjw
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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/bash
    cd /sys/fs/cgroup/cpu/docker/05d8e984eab7c53d82b2b4fe889bed11963170c6774c2f8507fe0a7166c9f46b/
    cat cpu.cfs_quota_us
    cat cpu.cfs_period_us
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 vim
    vim /cpu.sh
    #!/bin/bash
    i=0
    while true
    do
    let i++
    done
    chmod +x /cpu.sh
    ./cpu.sh
    top 	#可以看到这个脚本占了很多的cpu资源
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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_us
    docker exec -it 05d8e984eab7 /bin/bash
    ./cpu.sh
    top
    #可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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/bash
    yum install -y epel-release
    yum install stress -y
    stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根
    #查看容器运行状态(动态更新)
    docker stats
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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-release
    yum install stress -y
    stress -c 4
    #退出容器,执行 top 命令再按 1 查看CPU使用情况。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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/bash
    docker stats
    
    • 1
    • 2

    限制可用的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 in
    10+0 records out
    10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
    #清理docker占用的磁盘空间
    docker system prune -a
    #可以用于清理滋盘,删除关闭的容器、无用的数据卷和网络
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    三. 端口映射

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

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

    端口:容器内端口 ) |

    #自定义端口
    docker run -itd --name test1 -p 8081:80 nginx
    #需要在容器中开启nginx
    docker exec -it 72e1adbbda21
    #在网页测试
    http://192.168.48.14:8081
    #随机端口
    docker run -d --name test -P nginx
    docker run -itd -P nginx:latest /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    SpringBoot-38-Dubbo概述
    Docker——【部署项目的最优解】使用DockerCompose部署项目
    ElasticSearch入门
    Flutter插件开发指南01: 通道Channel的编写与实现
    Ubuntu22.04 安装Mongodb提示dpkg-deb: 错误
    FDA食品级认证是什么?
    如何设计一套单点登录系统 ?
    DBCO-PEG-Lentinan;Lentinan-PEG-DBCO;二苯并环辛炔聚乙二醇修饰香菇多糖
    [附源码]计算机毕业设计JAVAjsp校外教育机构类网站
    leetcode(hot100)——贪心算法
  • 原文地址:https://blog.csdn.net/qq_49124206/article/details/126888070