【docker集群应用】Docker网络与资源控制

news2024/11/27 22:46:21

文章目录

  • Docker 网络
    • Docker 网络实现原理
      • 端口映射示例
    • 查看容器的输出和日志信息
    • Docker 的网络模式
      • 查看 Docker 网络列表
      • Docker 容器网络命名空间示例
        • 创建并运行容器
        • 查看容器列表
        • 查看容器进程号
        • 查看容器的命名空间编号
        • 创建并运行共享网络命名空间的容器
        • 查看容器列表
        • 查看容器进程号
        • 查看容器的命名空间编号
  • Docker 资源控制
    • 1. CPU 资源控制
      • 1.1 设置 CPU 使用率上限
        • 进行CPU压力测试
      • 1.2 设置 CPU 资源占用比
      • 1.3 设置容器绑定指定的 CPU
    • 2. 内存使用限制
    • 3. 磁盘 IO 配额控制
      • 通过dd来验证写速度
    • 清理 Docker 占用的磁盘空间

Docker 网络

Docker 网络实现原理

Docker 使用 Linux 桥接技术,在宿主机上虚拟一个名为 docker0 的 Docker 容器网桥。当 Docker 启动一个容器时,会根据 docker0 网桥的网段分配给容器一个 IP 地址(Container-IP)。由于同一宿主机内的容器都连接到同一个网桥,因此容器之间可以通过各自的 Container-IP 直接通信。
Docker 网桥是虚拟的,不是真实存在的网络设备,因此外部网络无法直接寻址到它,这意味着外部网络无法直接通过 Container-IP 访问容器。如果希望外部网络能够访问容器,可以通过端口映射将容器端口映射到宿主主机,即使用 docker run 命令的 -p-P 参数。

端口映射示例

# 随机映射端口(从32768开始)
docker run -d --name test1 -P nginx

# 指定映射端口
docker run -d --name test2 -p 43000:80 nginx

通过 docker ps -a 可以查看容器的端口映射情况,例如:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                   NAMES
9d3c04f57a68   nginx     "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds    0.0.0.0:43000->80/tcp   test2
b04895f870e5   nginx     "/docker-entrypoint.…"   17 seconds ago   Up 15 seconds   0.0.0.0:49170->80/tcp   test1

可以通过浏览器访问 http://192.168.80.10:43000http://192.168.80.10:49170 来访问对应的容器。

查看容器的输出和日志信息

使用 docker logs 命令可以查看容器的输出和日志信息:

docker logs 容器的ID/名称

Docker 的网络模式

使用 --net--network 选项指定容器的网络模式

  1. Host 模式
    • 相当于 Vmware 中的桥接模式,与宿主机在同一个网络中,但没有独立 IP 地址。
    • 容器与宿主机共享同一个 Network Namespace,使用宿主机的 IP 和端口。
    • 使用 --net=host 指定。
  2. Container 模式
    • 新创建的容器与已存在的容器共享一个 Network Namespace。
    • 共享 IP、端口范围等,但文件系统、进程列表等仍然隔离。
    • 使用 --net=container:NAME_or_ID 指定。
  3. None 模式
    • 容器拥有自己的 Network Namespace,但不进行任何网络配置。
    • 只有 lo 回环网络,没有其他网卡。
    • 无法联网,但保证了容器的安全性。
    • 使用--net=none指定。
  4. Bridge 模式
    • Docker 的默认网络模式。
    • 容器使用独立的 Network Namespace,并连接到 docker0 虚拟网卡。
    • 通过 docker0 网桥和 iptables nat 表配置与宿主机通信。
    • 为每个容器分配 IP,并通过 veth pair 设备与 docker0 网桥连接。
    • 默认设置,可省略或使用 --net=bridge 指定。
  5. 自定义网络
    • 允许用户自定义网络配置,如指定子网、网关等。
    • 可以使用 docker network create 命令创建自定义网络。
    • 示例:
      # 创建自定义网络
      docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
      #docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。
      #mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
      # 使用指定 IP 运行容器
      docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
      

查看 Docker 网络列表

使用 docker network lsdocker network list 命令可以查看 Docker 网络列表:

docker network ls
# 或
docker network list

示例输出:

NETWORK ID     NAME      DRIVER    SCOPE
2b4359d229c6   bridge    bridge    local
0fa580365d39   host      host      local
cc13aa84a223   none      null      local

总结

  • Host:容器使用宿主机的 IP 和端口。
  • Container:容器与另一个指定容器共享 IP 和端口范围。
  • None:关闭容器的网络功能。
  • Bridge:默认模式,为每个容器分配 IP 并连接到 docker0 虚拟网桥。
  • 自定义网络:允许用户自定义网络配置。

Docker 容器网络命名空间示例

创建并运行容器
docker run -itd --name test1 centos:7 /bin/bash  # 创建名为 test1 的容器
查看容器列表
docker ps -a

输出示例:

CONTAINER ID   IMAGE      COMMAND       CREATED      STATUS       PORTS     NAMES
3ed82355f811   centos:7   "/bin/bash"   5 days ago   Up 6 hours             test1
查看容器进程号
docker inspect -f '{{.State.Pid}}' 3ed82355f811  # 查看 test1 容器的进程号

输出示例:

25945
查看容器的命名空间编号
ls -l /proc/25945/ns  # 查看 test1 容器的进程、网络、文件系统等命名空间编号

输出示例:

lrwxrwxrwx 1 root root 0 1月   7 11:29 ipc -> ipc:[4026532572]
lrwxrwxrwx 1 root root 0 1月   7 11:29 mnt -> mnt:[4026532569]
lrwxrwxrwx 1 root root 0 1月   7 11:27 net -> net:[4026532575]
lrwxrwxrwx 1 root root 0 1月   7 11:29 pid -> pid:[4026532573]
lrwxrwxrwx 1 root root 0 1月   7 12:22 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 1月   7 11:29 uts -> uts:[4026532570]
创建并运行共享网络命名空间的容器
docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash  # 创建名为 test2 的容器,并与 test1 共享网络命名空间
查看容器列表
docker ps -a

输出示例:

CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
ff96bc43dd27   centos:7   "/bin/bash"   48 seconds ago   Up 46 seconds             test2
3ed82355f811   centos:7   "/bin/bash"   58 minutes ago   Up 58 minutes             test1
查看容器进程号
docker inspect -f '{{.State.Pid}}' ff96bc43dd27  # 查看 test2 容器的进程号

输出示例:

27123
查看容器的命名空间编号
ls -l /proc/27123/ns  # 查看 test2 容器的进程、网络、文件系统等命名空间编号

输出示例:

lrwxrwxrwx 1 root root 0 1月   7 12:27 ipc -> ipc:[4026532692]
lrwxrmxrwx 1 root root 0 1月   7 12:27 mnt -> mnt:[4026532690]
lrwxrwxrwx 1 root root 0 1月   7 12:27 net -> net:[4026532575]
lrwxrwxrwx 1 root root 0 1月   7 12:27 pid -> pid:[4026532693]
lrwxrwxrwx 1 root root 0 1月   7 12:27 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 1月   7 12:27 uts -> uts:[4026532691]

Docker 资源控制

Docker 通过 Cgroups(Control Groups)机制来控制和限制容器使用的资源,包括 CPU、内存和磁盘 IO。以下是对这些资源控制的详细解释和示例。

1. CPU 资源控制

1.1 设置 CPU 使用率上限

  • CFS(Completely Fair Scheduler):Linux 使用CFS来调度各个进程对CPU的使用,CFS默认的调度周期是100ms。
  • –cpu-period:设置CPU调度周期(微秒),有效范围是1ms到1s(1000到1000000)。
  • –cpu-quota:设置每个周期内容器能使用的CPU时间(微秒),值必须大于等于1000。
    示例:
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED      STATUS       PORTS     NAMES
3ed82355f811   centos:7   "/bin/bash"   5 days ago   Up 6 hours             test5
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
cat cpu.cfs_quota_us 
-1
cat cpu.cfs_period_us 
100000

这将使容器 test6 在每个CFS周期中最多使用50%的CPU时间。
相关参数
cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。

进行CPU压力测试
docker exec -it 3ed82355f811 /bin/bash

vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done

chmod +x /cpu.sh
./cpu.sh

top	#可以看到这个脚本占了很多的cpu资源

设置50%的比例分配CPU使用时间上限

docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash#可以重新创建一个容器并设置限额

cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
top	#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果

在多核情况下,如果允许容器进程完全占用两个 CPU, 则可以将 cpu-period 设置为 100000( 即 0.1 秒), cpu-quota设置为 200000(0.2 秒)。

1.2 设置 CPU 资源占用比

  • –cpu-shares:指定CPU份额,默认值为1024,值为1024的倍数。当多个容器竞争CPU资源时,份额高的容器获得CPU时间片的几率更高。
    示例:
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name c1 --cpu-shares 1024 centos:7
docker run -itd --name c2 --cpu-shares 2048 centos:7

这将使容器 c2 在CPU资源竞争中获得比容器 c1 多一倍的机会。

#分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根
#查看容器运行状态(动态更新)
docker stats
CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
c3ee18e65852   c2               66.50%    5.5MiB / 976.3MiB     0.56%     20.4MB / 265kB   115MB / 14.2MB    4
bb02d3b345d8   c1               32.68%    2.625MiB / 976.3MiB   0.27%     20.4MB / 325kB   191MB / 12.7MB    4
  • 可以看到在 CPU 进行时间片分配的时候,容器 c2 比容器 c1 多一倍的机会获得 CPU 的时间片。
  • 但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 c1 一定能获得 CPU 时间片。比如容器 c1 的进程一直是空闲的,那么容器 c2 是可以获取比容器 c1 更多的 CPU 时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的 CPU 资源。
  • Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的 CPU 份额来确定有多少 CPU 资源分配给它,资源分配结果取决于同时运行的其他容器的 CPU 分配和容器中进程运行情况。

1.3 设置容器绑定指定的 CPU

  • –cpuset-cpus:允许容器在指定的CPU上运行。
    示例:
docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

这将使容器 test7 只能在CPU 1和CPU 3上运行。

#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4

然后退出容器,执行 top 命令再按 1 查看CPU使用情况。

2. 内存使用限制

  • -m 或 --memory:限制容器可以使用的最大内存。

示例

docker run -itd --name test8 -m 512m centos:7 /bin/bash
docker stats
  • –memory-swap:正常情况下,–memory-swap 的值包含容器可用内存和可用 swap。
    如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
    如果 --memory-swap 的值和 -m 值相同,则容器不能使用 swap。
    如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。
    强调一下,--memory-swap 是必须要与 --memory 一起使用的。

示例:容器 test8 最大使用512M内存,容器 test8_swap 可以使用300M内存和700M swap。

docker run -itd --name test8 -m 512m centos:7 /bin/bash
docker run -itd --name test8_swap -m 300m --memory-swap=1g centos:7 /bin/bash

所以 -m 300m --memory-swap=1g 的含义为:容器可以使用 300M 的物理内存,并且可以使用 700M(1G - 300)的 swap。

3. 磁盘 IO 配额控制

  • –device-read-bps:限制某个设备上的读速度(bps),单位可以是kb、mb或gb。
  • –device-write-bps(在Docker 25版本之后已无效):限制某个设备上的写速度(bps)。
  • –device-read-iops:限制读某个设备的IOPS(每秒读次数)。
  • –device-write-iops:限制写入某个设备的IOPS(每秒写次数)。
    示例:
docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
docker run -it --name test10 --device-write-iops /dev/sda:1000 centos:7 /bin/bash

这将使容器 test9 对设备 /dev/sda 的读速度限制为1MB/s,容器 test10 对设备 /dev/sda 的写IOPS限制为1000次/秒。

通过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 命令可以清理关闭的容器、无用的数据卷和网络,释放磁盘空间。

docker system prune -a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理(一)A*算法原理(二)人工蜂群算法原理(三)混合ABC和A*算法策略 三、代码实现(一)数据准备(二)关键函数实现…

linux运行vue编译后的项目

如果你的 Vue 项目使用了 history 模式(而非默认的 hash 模式),在纯静态服务器中会出现类似的问题。因为 Vue Router 的 history 模式要求所有未匹配的路径都重定向到 index.html,以便 Vue 前端处理路径。 首先在本地执行npm run…

模拟实现Bash

模拟实现Bash 1.Bash基本认识2.Bash实现3.添加细节4.内置命令5.完整代码 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux的学习】 📝📝本篇内容…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候,就会导致溢出,mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

Hadoop3.3.6集群安装

Hadoop3.3.6 三节点集群安装 准备工作 准备三台机器,大小为4c8g,主节点为 8c16g。并需要保证网络连通性,每台机器都相互ping一下 1、关闭网络防火墙 # 查看网络防火墙状态 sudo systemctl status firewalld # 立即停止 firewalld sudo sy…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/,这个就是将论文中的内容或者补充视频放到一个网页上,以更好的展示他们的工作。因此,这里介绍下如何使用前人提供的模板制作我…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范,遵循这套规范,任…

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建,使…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中,其实搞懂了单链表和双向哨兵位循环链表,这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下: 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体,双向循环链表的每一个…

高级AI记录笔记(五)

学习位置 B站位置:红豆丨泥 UE AI 教程原作者Youtube位置:https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉,因为我们希望敌人在受到伤害后立即进行…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时,中文字符的显示常常会出现乱码问题,尤其在 macOS 系统上。在网上找了一大堆方法,花了很久,发现不是要安装各种字体就是要改配置&…

11.25.2024刷华为OD

文章目录 HJ76 尼科彻斯定理(观察题,不难)HJ77 火车进站(DFS)HJ91 走格子方法,(动态规划,递归,有代表性)HJ93 数组分组(递归)语法知识…

突破性算法:让无人机集群在狭窄空间内穿针引线

导读 在建筑救援、森林搜索等任务中,无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突,或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化,而局部避…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

【Shell】运维快捷键及shell各种不同实际运维场景

一,控制台使用技巧 1,操作快捷键 Ctrlr :可以快速查找历史命令 Ctrll :可以清理控制台屏幕 Ctrla \ Ctrle :移动光标到命令行首\行尾 Ctrlw \ Ctrlk :删除光标之前\之后的内容 2,VIM文件编辑快捷键 快捷键ZZ :文件保存并退出 3&#xff…

SlickGrid复选框

分析 1、先在columns首列添加复选框; 2、在SlickGrid注册刚添加的复选框; 3、添加复选框变化事件; 4、注册按钮点击事件,点击获取已选中的行。 展示 代码 复选框样式(CSS) .slick-cell-checkboxsel {bac…

基于单片机的智慧小区人脸识别门禁系统

本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集,识别成功后,舵机模块动作,模拟门禁打开,门…

【小白学机器学习33】 大数定律python的 pandas.Dataframe 和 pandas.Series基础内容

目录 0 总结 0.1pd.Dataframe有一个比较麻烦琐碎的地方,就是引号 和括号 0.2 pd.Dataframe关于括号的原则 0.3 分清楚几个数据类型和对应的方法的范围 0.4 几个数据结构的构造关系 list → np.array(list) → pd.Series(np.array)/pd.Dataframe 1 python 里…

Edge浏览器保留数据,无损降级退回老版本+禁止更新教程(适用于Chrome)

3 个月前阿虚就已经写文章告警过大家,Chromium 内核的浏览器将在 127 以上版本开始限制仍在使用 Manifest V2 规范的扩展:https://mp.weixin.qq.com/s/v1gINxg5vMh86kdOOmqc6A 像是 IDM、油猴脚本管理器、uBblock 等扩展都会受到影响,后续将无…

基于Spring Boot的装饰工程管理系统论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大,容错率低&#x…