news 2026/4/16 12:21:29

Docker 入门前置:容器虚拟化基础之 cgroups 资源控制与 LXC 容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 入门前置:容器虚拟化基础之 cgroups 资源控制与 LXC 容器

文章目录

    • 一、资源控制
      • 1.1 cgroups
      • 1.2 pidstat
      • 1.3 stress
      • 1.4 实操
        • 1.4.1 对内存进行控制
        • 1.4.2 对 CPU 进行控制
    • 二、LXC 容器
      • 2.1 LXC 认识
      • 2.2 LXC 命令
      • 2.3 安装 LXC
      • 2.4 LXC 容器实操

一、资源控制

1.1 cgroups

cgroups(Control Groups)是 Linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

cgroups 的用途

  • Resource limitation:限制资源使用,例:内存使用上限/CPU 的使用限制
  • Prioritization:优先级控制,例:CPU 利用/磁盘 IO 吞吐
  • Accounting:一些审计或一些统计
  • Control:挂起进程/恢复执行进程

cgroups 可以控制的子系统

子系统功能说明
blkio对块设备的 IO 进行限制
cpu限制 CPU 时间片的分配
cpuacct生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录
cpuset给 cgroup 中的任务分配独立的 CPU(多处理器系统)和内存节点
devices限制设备文件的创建,和对设备文件的读写
freezer暂停/恢复 cgroup 中的任务
memory对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告
perf_event允许 perf 观测 cgroup 中的 task
net_clscgroup 中的任务创建的数据报文的类别标识符,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制
hugetlb限制使用的内存页数量
pids限制任务的数量
rdma限制 RDMA 资源(Remote Direct Memory Access,远程直接数据存取)

1.2 pidstat

pidstat 是 sysstat 的一个命令,用于监控全部或指定进程的 CPU、内存、线程、设备 IO 等系统资源的占用情况。pidstat 第一次采样显示自系统启动开始的各项统计信息,后续采样将显示自上次运行命令后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

语法

pidstat[选项][<时间间隔>][<次数>]

参数

参数说明
-u默认参数,显示各进程的 CPU 使用统计
-r显示各进程的内存使用统计
-d显示各进程的 IO 使用情况
-p指定进程号,ALL 表示所有进程
-C指定命令
-l显示命令名和所有参数

安装

  • Ubuntu 安装
# 卸载aptremove sysstat -y# 安装aptinstallsysstat -y
  • CentOS 安装
# 卸载yum remove sysstat -y# 安装yuminstallsysstat -y

1.3 stress

stress 是 Linux 的一个压力测试工具,可以对 CPU、Memory、IO、磁盘进行压力测试。

语法

stress[OPTION[ARG]]

参数

参数说明
-c, --cpu N产生 N 个进程,每个进程都循环调用 sqrt 函数产生 CPU 压力
-i, --io N产生 N 个进程,每个进程循环调用 sync 将内存缓冲区内容写到磁盘上,产生 IO 压力。通过系统调用 sync 刷新内存缓冲区数据到磁盘中,以确保同步。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生 IO 压力。在 SSD 磁盘环境中尤为明显,很可能 iowait 总是 0,却因为大量调用系统调用 sync,导致系统 CPU 使用率 sys 升高
-m, --vm N产生 N 个进程,每个进程循环调用 malloc/free 函数分配和释放内存
–vm-bytes B指定分配内存的大小
–vm-keep一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存)
-d, --hdd N产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件)
–hdd-bytes B指定文件大小
-t, --timeout N在 N 秒后结束程序
-q, --quiet程序在运行的过程中不输出信息

安装

  • Ubuntu 安装
# 卸载aptremove stress -y# 安装aptinstallstress -y
  • CentOS 安装
# 卸载yum remove stress -y# 安装yuminstallstress -y

1.4 实操

1.4.1 对内存进行控制

cgroupv1 操作

  1. 创建内存控制组:进入/sys/fs/cgroup/memory目录,创建test_memory目录(系统会自动生成内存限制相关配置文件)
cd/sys/fs/cgroup/memorymkdirtest_memory
  1. 配置内存上限(限制为 20M):
# 计算20M对应的字节数expr20\*1024\*1024# 输出20971520# 设置内存上限echo"20971520">test_memory/memory.limit_in_bytes
  1. 启动内存压力进程(占用50M内存):
stress -m1--vm-bytes 50M
  1. 查看进程PID并绑定到控制组:
# 查看stress进程PID(假设为62518)pidstat -r -C stress -p ALL1# 将进程加入控制组echo62518>>test_memory/tasks

效果:进程因内存超限被终止。

1.4.2 对 CPU 进行控制

cgroupv1 操作

  1. 创建CPU控制组:
cd/sys/fs/cgroup/cpumkdirtest_cpu
  1. 限制CPU使用率为30%(公式:cfs_quota_us/cfs_period_us=30000/100000):
echo30000>test_cpu/cpu.cfs_quota_us
  1. 启动CPU压力进程并绑定(假设PID为62577):
# 启动100%CPU占用进程stress -c1# 绑定进程到控制组echo62577>test_cpu/tasks

效果:CPU使用率被限制在30%。

至此成功的模拟了对内存和 CPU 的使用控制,而 Docker 本质也是调用这些的 API 来完成对资源的管理,只不过 Docker 的易用性和镜像的设计更加人性化,所以 Docker 才能风靡全球,而Docker 对资源控制,对比这种控制可以说简单不止一倍。


二、LXC 容器

2.1 LXC 认识

LXC(LinuX Containers)Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。

LXC 是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案。

LXC 虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。

后来就出现了 docker,所以从一定程度上来说,docker 就是 LXC 的增强版。

2.2 LXC 命令

常用命令

命令功能格式
lxc-checkconfig检查系统是否满足容器使用要求lxc-checkconfig
lxc-create创建 LXC 容器lxc-create -n NAME -t TEMPLATE_NAME [-- template-options]
lxc-start启动容器lxc-start -n NAME -d
lxc-ls列出所有容器(-f 显示常用信息)lxc-ls -f
lxc-info查看容器详细信息lxc-info -n NAME
lxc-attach进入容器执行命令lxc-attach --name=NAME [-- COMMAND]
lxc-stop停止容器lxc-stop -n NAME
lxc-destroy删除停机状态的容器lxc-destroy -n NAME

2.3 安装 LXC

  • Ubuntu 安装
# 安装主程序、模板及网桥工具aptinstalllxc lxc-templates bridge-utils -y# 检查服务运行状态systemctl status lxc
  • CentOS 安装
# 配置 EPEL 源yum -yinstallepel-release# 安装依赖及主程序yum -yinstalllxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc-extradebootstrap# 启动服务systemctl start lxc systemctl start libvirtd# 检查服务状态systemctl status lxc systemctl status libvirtd

2.4 LXC 容器实操

  1. 检查 LXC 服务状态
systemctl status lxc

正常状态:输出显示active (exited),表示服务已就绪。

  1. 检查系统功能支持
lxc-checkconfig

核心检查项:Namespaces(UTS、IPC、PID 等)、Control groups 均需显示enabled,确保容器隔离与资源控制功能可用。

  1. 查看容器模板

LXC 提供多种系统模板,存储路径为/usr/share/lxc/templates/

ls/usr/share/lxc/templates/

常见模板:lxc-ubuntu、lxc-centos、lxc-debian、lxc-alpine 等。

  1. 创建 LXC 容器
  • Ubuntu 系统创建 Ubuntu 容器
# -t 指定模板,-n 指定容器名,-r 指定系统版本,-a 指定架构lxc-create -t ubuntu -n lxchost1 -- -r xenial -a amd64
  • CentOS 系统创建 CentOS 容器
lxc-create -t centos --name centos1
  • Ubuntu 系统创建 CentOS 容器(需用 download 模板)
lxc-create --name centos7 --template=download -- --dist=centos --release=7--arch=x86_64

创建成功提示:默认用户ubuntu,密码ubuntu,容器存储路径为/var/lib/lxc/<容器名>,根文件系统路径为/var/lib/lxc/<容器名>/rootfs

  1. 查看容器列表
lxc-ls -f

输出说明:显示容器名称、状态(STOPPED/RUNNING)、IP 地址等信息。

  1. 启动容器
# -d 表示后台运行lxc-start -n lxchost1 -d# 验证启动状态lxc-ls -f

启动成功:容器状态变为RUNNING,并分配内网 IP(如 10.0.3.248)。

  1. 查看容器详细信息
lxc-info -n lxchost1

输出内容:包含容器 PID、IP 地址、CPU/内存/磁盘使用量等。

  1. 进入容器(SSH 方式)
# 用户名 ubuntu,密码 ubuntu,IP 为容器分配的内网 IPsshubuntu@10.0.3.248

容器内验证:执行ip addrdf -hps -ef等命令,可见容器拥有独立的网络、文件系统和进程空间。

  1. 容器外执行命令

无需进入容器,直接在宿主机执行容器内命令:

# --clear-env 清除环境变量,执行 echo 命令lxc-attach -n lxchost1 --clear-env --echo"Hello bit"
  1. 停止容器
lxc-stop -n lxchost1# 验证停止状态lxc-ls -f
  1. 删除容器(需先停止)
lxc-destroy -n lxchost1# 验证删除结果lxc-ls -f
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:21:02

综合长文档效率战|万字毕业论文,用“快降重”统一风格、抢救AI率

摘要 毕业论文终稿往往是多部分拼合而成&#xff0c;风格不一&#xff0c;AI率参差不齐。最后一篇实测&#xff0c;我将一篇混合了引言、方法、分析、结论的万字长文档整体处理&#xff0c;测试“快降重”在大体量、混合内容下的综合表现与效率。 真实情况说明 我的论文不同章节…

作者头像 李华
网站建设 2026/4/15 20:22:08

2026年AI测试市场增长预测报告

一、市场规模与增长驱动力 2026年&#xff0c;全球AI测试工具市场规模已突破50亿美元&#xff08;约合人民币350亿元&#xff09;&#xff0c;远超“百亿”人民币门槛&#xff0c;标志着AI驱动的测试范式从“辅助工具”跃升为“质量基础设施”。这一增长主要由三重引擎驱动&am…

作者头像 李华
网站建设 2026/4/4 0:53:58

提示工程架构师必备:物流规划中的上下文蒸馏技术

提示工程架构师必备&#xff1a;物流规划中的上下文蒸馏技术 一、引言&#xff1a;当大模型遇到“物流信息爆炸” 你有没有遇到过这样的场景&#xff1f; 用GPT帮快递公司做路径规划时&#xff0c;它明明接收了1000条订单数据、50个仓库库存、20辆车辆状态、30条约束规则&…

作者头像 李华
网站建设 2026/4/16 0:50:27

工业控制嵌入式开发:Modbus 协议在 STM32 中的实现与调试

第一部分&#xff1a;Modbus协议体系结构深度解析Modbus协议的技术演进与标准体系Modbus协议的发展历程见证了工业自动化技术的演进轨迹。最初的Modbus RTU协议基于RS-485物理层&#xff0c;采用二进制编码和CRC校验&#xff0c;在工业现场表现出优异的抗干扰能力和可靠性。随着…

作者头像 李华
网站建设 2026/4/16 10:59:52

全网最全研究生必备AI论文工具TOP10

全网最全研究生必备AI论文工具TOP10 2026年研究生必备AI论文工具测评维度解析 在科研任务日益繁重的当下&#xff0c;研究生群体对高效、专业的写作辅助工具需求愈发迫切。从文献检索到内容生成&#xff0c;从格式排版到查重检测&#xff0c;每一个环节都可能成为影响论文质量的…

作者头像 李华
网站建设 2026/4/13 22:41:25

【Redis基础入门篇1】一篇搞懂 Redis:是什么?为什么用?怎么装?

&#x1f4bb; Hello World, 我是 予枫。 代码不止&#xff0c;折腾不息。作为一个正在升级打怪的 Java 后端练习生&#xff0c;我喜欢把踩过的坑和学到的招式记录下来。 保持空杯心态&#xff0c;让我们开始今天的技术分享。 在日常开发中&#xff0c;不管是面试还是实际业务&…

作者头像 李华