news 2026/3/26 15:31:31

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/3/23 23:35:41

基于SpringBoot的大学生创新创业项目管理系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在构建一个基于SpringBoot的大学生创新创业项目管理系统&#xff0c;以实现以下研究目的&#xff1a; 首先&#xff0c;通过构建该系统&#xff0c;…

作者头像 李华
网站建设 2026/3/21 11:38:05

基于SpringBoot的学生信息管理系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在开发并实现一个基于SpringBoot框架的学生信息管理系统&#xff0c;以满足现代教育信息化背景下对学生信息管理的需求。具体研究目的如下&#xff…

作者头像 李华
网站建设 2026/3/12 21:01:08

Windows CMD(命令提示符)常用指令大全

文章目录 前言一、 文件与目录管理&#xff08;最常用&#xff09;二、 系统信息查询三、 网络测试与连接四、 进程管理五、 其他实用指令六、 管理员权限说明总结 前言 只提供常用的指令&#xff0c;便于学习&#xff0c;也不容易乱。面面俱到的话建议学习官方文件或者其他提…

作者头像 李华
网站建设 2026/3/8 16:52:23

人群仿真软件:SimWalk_(6).人群流特性及参数设置

人群流特性及参数设置 在人群仿真软件中&#xff0c;人群流特性及参数设置是至关重要的环节。这些参数不仅影响仿真结果的准确性&#xff0c;还决定了仿真场景的逼真度。本节将详细介绍如何在SimWalk中设置和调整人群流特性&#xff0c;包括行人的行走速度、密度、行为模式等&a…

作者头像 李华
网站建设 2026/3/25 13:13:07

大模型推理能力的评估标准与方法

大模型推理能力的评估标准与方法 关键词:大模型、推理能力、评估标准、评估方法、自然语言处理 摘要:本文聚焦于大模型推理能力的评估标准与方法。随着大模型在自然语言处理等众多领域的广泛应用,其推理能力的准确评估变得至关重要。文章首先介绍了相关背景,包括目的、预期…

作者头像 李华