当前位置: 首页 > news >正文

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

docker网络模式

Host

容器与宿主机共享网络namespace,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其他使用host模式的容器不能用同一个端口)、路由、iptables规则等网络资源

设置此模式
docker run --network=host

Container

和指定已存在的容器共享网络namespace,即这两个容器使用同一个IP、端口范围(容器与指定的容器不能用同一个端口)、路由、iptables规则等网络资源。

设置此模式
docker run --network=container:容器名|容器ID

None

每个容器都有独立的网络namespace,但是容器没有自己的eth0网卡、IP、端口等网络资源,只有lo网卡

设置此模式
docker run --network=none

Bridge

docker默认网络模式,使用此模式下的每个容器都有独立的网络命名空间(namespace),即每个容器都有独立的IP、端口范围(每个容器可以用同一个端口)、路由、iptables规则等网络信息

设置此模式
docker run [--network=bridge](可不指定,默认的)

自定义网络

可以自己定义创建一个网段、网桥、网络模式,从而可自定义容器的IP来创建容器

创建自定义网络:

docker network create --subnet 自定义网段 --opt"com.docker.network.bridge.name"="自定义网桥名"  自定义网络模式名
​
docker run --network 自定义网络模式名 --ip 自定义容器IP

查看docker网络列表

docker network ls    或  docker network list    

资源控制

Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 cgroup 资源限制(限制容器进程对CPU、内存、磁盘IO等资源的最大使用量)

1、CPU资源控制

cd /sys/fs/cgroup/cpu/docker/容器id
cat cpu.cfs_quota_us  
表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。
​
cat cpu.cfs_period_us 
cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。

1)设置单个容器进程能够使用的CPU使用率上限

进行CPU压力测试

docker run -itd --name test5 centos:7 /bin/bash
docker ps -a #查看对应的容器id
docker exec -it 容器id /bin/bash
​
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
​
chmod +x /cpu.sh
./cpu.sh
​
top   #可以看到这个脚本占了很多的cpu资源
 
cd /sys/fs/cgroup/cpu/docker/容器id
echo 50000 > cpu.cfs_quota_us 
​
docker exec -it 容器id /bin/bash
./cpu.sh
​
top   #可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果
针对新建的容器
docker run --cpu-period 单个CPU调度周期时间(1000~1000000) --cpu--quota 容器进程能够使用的最大CPU时间(>=1000)
针对已存在的容器
修改/sys/fs/cgroup/cpu/docker/容器id/目录下的cat cpu.cfs_quota_uscat cpu.cfs_period_us文件的值docker run -itd --name test5 centos:7 /bin/bash
docker ps -a
cd/sys/fs/cgroup/cpu/docker/容器id
cpu.cfs_quota_us
cpu.cfs_period_us

2)设置多个容器的CPU占用份额

(只能在多个容器同时运行且CPU资源紧张时生效)

docker run --cpu-shares 容器进程最大占用CPU的份额(值为1024的倍数)

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

可以看到在 CPU 进行时间片分配的时候,容器 c2 比容器 c1 多一倍的机会获得 CPU 的时间片。 但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 c1 一定能获得 CPU 时间片。比如容器 c1 的进程一直是空闲的,那么容器 c2 是可以获取比容器 c1 更多的 CPU 时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的 CPU 资源。

Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的 CPU 份额来确定有多少 CPU 资源分配给它,资源分配结果取决于同时运行的其他容器的 CPU 分配和容器中进程运行情况。

3)设置容器绑定指定的CPU

docker run --cpuset-cpus CPUID1[,CPUID2,....]
​
#先分配虚拟机4个CPU核数
docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash绑定cpu1和3
​
#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
​
#退出容器,执行 top 命令再按 1 查看CPU使用情况。

2、内存限制

设置容器能够使用的内存和swap的值

-m(--memory=) 选项用于限制容器可以使用的最大内存docker run -itd --name wx -m 512m centos:7 bash

docker run -m 内存大小 --memory-swap 内存和swap的总值
限制可用的 swap 大小, --memory-swap
强调一下,--memory-swap 是必须要与 --memory 一起使用的。内存设置0或者不设置,表示swap为内存的两倍内存设置-1,表示不限制swap的值,宿主机有多少,容器就可使用多少内存设置与-m一样的值,表示不适用swap

3、磁盘IO限制

docker run --device-read-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上读的速度--device-write-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上写的速度--device-read-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上读的次数--device-write-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上写的速度

 清除已停止的容器、没用到的镜像和网络、缓存

docker清空docker system prune -a先查看目前所有的镜像和容器docker ps -a docker images

http://www.lryc.cn/news/288869.html

相关文章:

  • 安装 nvm
  • Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)
  • 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测
  • 如何实现无公网IP实现远程访问MongoDB文件数据库
  • 华为防火墙USG6000V1的NAT实验
  • spark-flink设计思想之吸星大法-1
  • 力扣1312. 让字符串成为回文串的最少插入次数
  • qemu的安装
  • myql入门
  • 前端开发有没有必要转鸿蒙开发?
  • 《动手学深度学习(PyTorch版)》笔记1
  • 前端工程化之:webpack1-5(配置文件)
  • 代码随想录栈和队列专题二刷复盘day17
  • 代码随想录算法刷题训练营day16
  • 【C语言/数据结构】排序(直接插入排序|希尔排序)
  • Jupyter Notebook安装使用教程
  • Unity 中的接口和继承
  • C++区间覆盖(贪心算法)
  • Python with Office 054 - Work with Word - 7-9 插入图像 (3)
  • Nodejs前端学习Day4_fs文件系统模块基础应用之成绩转换
  • 五、Kotlin 函数进阶
  • 重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(一)
  • 定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱
  • git checkout和git switch的区别
  • 故障树分析蒙特卡洛仿真程序(附MATLAB完整代码)
  • 数据结构-线性表
  • java金额数字转中文
  • Ubuntu findfont: Font family ‘SimHei‘ not found.
  • mysql小知识
  • Unity中URP下逐顶点光照