docker的网络与cgroup资源限制

一. docker的网络

桥接模式:这是docker默认的网络模式
桥接模式工作在第二层,也就是数据链路层。(数据帧)

  1. 安装完成docker时,docker会自动创建一个虚拟的网络桥,类似于交换机。
  2. 分配唯一的ip地址,当用户创建容器时,docker会分配唯一的ip地址给创建的容器使用。
    ip地址的范围是在桥接网络的网段之中。当容器被销毁时,ip地址也会被回收,可以继续供下一个容器使用。
  3. 容器连接到网桥,当容器启动时,容器的虚拟接口(veth pair)连接到网桥,一个端点在容器,另一个端点在主机
  4. 容器于主机通信,通过网桥模式,容器可以直接于主机进行通信
  5. 容器于容器之间,不同的容器在同一个网段,连接在同一个网桥上运行,容器也有唯一的ip地址,容器可以通过彼此之间的ip地址直接通信。docker会在网桥模式上自动设置路由,容器之间也可以直接交流。(docker是单节模式,容器不能实现跨主机的通信)
  6. NAT(网络地址转换)docker在宿主机之间通信实际上使用的NAT的技术,也就是说暴露端口,和主机的端口进行映射,是把容器内部的私有ip地址,转换成宿主机的的ip地址。实现容器与外部之间的通信。

1.1 docker的网络模式

docker network ls
查看docker的所有模式

  1. bridge默认模式

  2. host模式,创建容器时,指定容器的模式为host,那么容器不会有自己的网卡,也不会有内部的ip地址。使用宿主机的ip和端口
    docker run -itd --name test1 -p 80:80 --network host nginx:1.22
    在这里插入图片描述

  3. container模式:在这个模式下,容器和容器之间共享一个网络命令空间,新的容器也不会创建自己的网卡和ip。而是和另外一个容器共享ip和端口。两个容器之间除了网络是一致的,其他的还是隔离的。主要用于内部数据的通信和容器内部的挂载卷。

docker run -itd --name centos1 centos:7

docker run -itd --name centos2 --network container:centos1 centos:7

docker inspect -f '{{.State.Pid}}' centos1 
可以获取容器的pid号
#查看容器的进程、网络、文件系统等命名空间编号
ls -l /proc/2406/ns
docker inspect -f '{{.State.Pid}}' centos2
ls -l /proc/2477/ns

在这里插入图片描述

  1. none模式 指定网络模式为none的容器,会有自己网络空间,但是没有任何网络配置。只能在容器的内部自己访问。用于创建容器时,进行内部的业务测试使用。
docker run -itd --name=nginx2 --network none nginx:1.22

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2

在这里插入图片描述

docker exec -it nginx2 bash

curl 127.0.0.1

在这里插入图片描述

5、自定义网络模式,用户可以给docker创建一个自定义的虚拟网桥设备,可以给这个设备自定义网段。创建容器时,可以使用自定义的网桥设备,给容器自定义ip地址。(只有先创建自定义网桥,才可以给容器指定ip地址)

#创建自定义网络:
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="dokcer1" mynetwork
--opt "com.docker.network.bridge.name"="dokcer1":指定网卡的名称,可不加

在这里插入图片描述

docker run -itd --name nginx5 --network mynetwork --ip 172.18.0.10 nginx:1.22
#创建容器时,指定ip地址

在这里插入图片描述

二. docker的cgroup资源限制

docker是通过cgroup来对资源进行限制,资源配置主要三个方面:cpu,内存和硬盘(硬盘几乎不用)

2.1 cpu资源控制

linux通过CFS( COMPLETELY fair scheduler)完全公平调度器,来对进程使用cpu的时间进行调度。
CFS模式的调度周期是100ms,通过这个周期来设置每个容器占用cpu的调度周期。

  • cpu.cfs_period_us:可调度周期,进程可以占用cpu的时间,默认所有。1000-1000000
  • cpu.cfs_quota_us:设置在周期内,进程占用cpu的时间进行配额管理。>=1000
    在这里插入图片描述
    多个容器分配cpu的占比
    占比是按照权重来进行分配,默认是1024,必须是1024的倍数。

--cpu-shares

  • 同时设置多个容器的权重才能生效,最少2个。
  • 只有当容器分配的资源紧张时,才会根据配额分配cpu的占比。
  • 分配权重也会根据其他已经设置的容器的cpu使用情况来进行配额的管理
docker run -itd --name test1 --cpu-shares 512 ubuntu:22.04

docker run -itd --name test2 --cpu-shares 1024 ubuntu:22.04

docker exec -it test1 bash
apt-get update
apt -y install stress
stress -c 4

docker exec -it test2 bash
apt-get update
apt -y install stress

stress -c 4

#查看容器运行状态(动态更新)
docker stats

#设置容器绑定cpu.
docker run -itd --name test3 --cpuset-cpus 1,3 ubuntu:22.04
  1. 已绑定cpu的实现资源的配置 只能占用cpu的20% 1,3
    在这里插入图片描述
  2. 绑定cpu实现权重比, A的比重是B的1:2 ubuntu1 ubuntu2
    256 512
    在这里插入图片描述

2.2 对内存使用的限制

-m(-memory=) 选项用于限制容器可以使用的最大内存

docker run -itd --name test4 -m 1g ubuntu:22.04

对swap空间进行限制的前提,必须要限制内存的使用。
-m 512m --memory-swap=1g

1g-512m= 512m-------swap空间的限额

-m 512m --memory-swap=0:或者不设置,表示swap的空间的限额是内存限额的两倍。
-m 512m --memory-swap=512m:容器不能够使用swap空间。
-m 512m --memory-swap=-1:内存的限额是512m,但是swap空间的使用不受限制。

2.3 磁盘的I/O进行配置

2.3.1 限制磁盘的读

docker run -itd --name test4 --device-read-bps /dev/sda:1M  ubuntu:22.04

2.3.2 限制磁盘的写

docker run -itd --name test5 --device-write-bps /dev/sda:1M  ubuntu:22.04

三. 练习

创建一个容器,使用的镜像是nginx,绑定cpu在0上
限制该容器的使用内存是512m,使用cpu的限额是全部时间的20%
使用一条命令完成
网络模式
A容器使用的模式是host,直接可以访问
B容器使用自定义网络—192.168.10.0/24 给容器指定ip地址是192.168.10.10,做端口映射,宿主机的8080:80

#A容器
docker run -itd --name test1 --cpuset-cpus 0 -m 512m --cpu-quota 20000 --network host nginx:1.22
#B容器
docker network create --subnet=192.168.10.0/24 mynetwork
docker run -itd --name test2 --network mynetwork --ip 192.168.10.10 -p 8080:80 --cpuset-cpus 0 -m 512m --cpu-quota 20000 nginx:1.22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值