Docker 前瞻

一、namespace 指令

1.1 dd 命令

dd 命令用于读取、转换并输出数据。

dd 命令可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

语法

bash 复制代码
dd option
  • if= 文件名:输入文件名,默认为标准输入。及指定源文件
  • of= 文件名:输出文件名就,默认为标准输出。即指定目的文件。
  • ibs= n:一次读入 n 个字节。
  • obs=n:一次输出 n 个字节。
  • bs=n:同时设置输入/输出的块大小为 bytes个字节
  • cbz= n:一次转换 n 个字节,即指定转换缓冲区大小。
  • skip=n:从输入文件开头跳过 n 个块后再开始复制(块大小等于 ibs)
  • seek=n:从输出文件开头跳过 n 个块后再开始复制(块大小等于obs)
  • count=n:仅拷贝 n 个块,块大小等于 ibs 指定的字节数
  • conv=<关键字>:
    1. block:把每一行转换为长度为 cbs,不足部分用空格填充
    2. unblock:是每一行的长度都为 cbs, 不足的部分用空格填充
    3. lcase:把大写字符转换为小写字符
    4. ucase:把小写字符转换为大写字符

案例:

bash 复制代码
# 生成一个 大小为 8M 的镜像文件(指令不要带空格)
dd if=/dev/zero of=test.img bs=8 count=1024

#将 test.txt 文件中的所有英文字母转换为大写,然后转换成 test2.txt 文件
dd if=test.txt of=test2.txt conv=ucase

1.2 mkfs

再设备上创建 Linux 文件系统,俗称格式化。

语法:

bash 复制代码
mkfs option

-t fstype:指定要建立何种文件系统:如 ext3,ext4

案例:

bash 复制代码
#将 sda6 分区格式化为 ext4 格式 
mkfs -t ext4 /dev/sda6

#格式化镜像文件为 ext4
mkfs -t ext4 ./fdimage.img

1.3 df 命令

显示目前再 Linux 系统上的文件系统磁盘使用情况统计。

语法:

bash 复制代码
df [OPTION]... [FILE] ...

常见参数:

  • -a, --all 包含所有具有 0 Blocks 的文件系统
  • -h, --human-readable 使用人类可读的格式
  • -H,--si 很想 -h, 但是 用1000 为单位,而不是1024
  • -t, --type=TYPE 限制列出文件系统的 TYPE
  • -T,--print-type 显示文件系统的形式

案例:

bash 复制代码
#查看磁盘使用情况
df -h
#查看磁盘的系统类型
df -Th

1.4 mount

用于加载文件系统到指定的加载点,此命令常用于挂在光盘,使我们可以访问光盘中的数据,因为你将光盘插入到光驱中,Linux 是不会自动挂载,必须使用 Linux mount 命令 来手动完成挂在。

Linux系统下不同的目录可以挂在不同的分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载)

不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备

挂载的实质使为磁盘添加入口(挂载点)

语法:

bash 复制代码
mount [-l]
mount [-t vfstype] [-0 options] device dir

常见参数

  • -l :显示已加载的文件系统列表
  • -t:加载文件系统类型,支持常见的系统类型:ext3,ext4,iso9660 等,大部分可以不指定,mount 可以自己识别
  • -o options 主要用来描述设备或档案的挂接方式
    1. loop:用来把一个文件当成硬盘分区挂接上系统
    2. ro:采用只读的方式挂接设备
    3. rw:采用读写方式挂接设备
  • device:要挂接(mount)的设备。
  • dir:挂在点的目录

案例:

bash 复制代码
#将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4

1.5 unshare

unshare 主要能力是使用与父进程不共享的命名空间运行程序

语法:

bash 复制代码
unshare [options] program [arguments]

常用参数:

  • -i,--ipc:不共享 IPC 空间
  • -m,--mount:不共享 Mount 空间
  • -n,--net:不共享 Net 空间
  • -p,--pid:不共享 PID 空间
  • -u,--uts:不共享 UTS 空间
  • -U,--user:不共享用户
  • -V,--version:版本查看
  • --fork:执行 unshare 的进程 fork 一个新的子进程,再子进程里执行 unshare 传入的参数。
  • --mount-proc:执行子进程前,优先将 proc 挂在过去。

案例1:hostname 隔离

bash 复制代码
# /bin/bash 主机隔离
unshare -u /bin/bash
root@qingkai:/dockertest# hostname test
root@qingkai:/dockertest# hostname
test
root@qingkai:/dockertest# exit
exit
root@qingkai:/dockertest# hostname
qingkai

案例2:进程隔离

bash 复制代码
unshare --fork -p --mount-proc /bin/bash

1. 为什么需要 --fork

当使用 unshare 创建新的 PID 命名空间 时,若不指定 --forkunshare 进程自身会直接进入新命名空间,并成为该命名空间的第一个进程(PID 1)。但此时存在一个问题:

  • 父进程不在新命名空间中 :原进程(如当前 shell)与新命名空间中的 unshare 进程形成父子关系,但父进程属于原命名空间,导致内核无法正确管理新命名空间的进程层级。

  • 报错 Cannot allocate memory:内核需要确保新命名空间的进程树是自洽的(即父进程也在同一命名空间中),否则会因无法建立进程树而报内存错误。

--fork 的作用

通过 fork() 创建一个子进程(新的 bash 进程),让该子进程成为新 PID 命名空间的第一个进程(PID 1),而原 unshare 进程退出。这样新命名空间的进程树从子进程开始,符合内核的层级要求。


2. --pid 参数的含义

  • 隔离 PID 命名空间--pid 表示仅创建新的 PID 命名空间,其他命名空间(如 mountnetworkuts 等)与原系统共享。

  • 效果

    • 新命名空间中的进程拥有独立的 PID 编号(例如,bash 进程的 PID 为 1)。

    • 其他资源(如文件系统、网络接口)仍与原系统共享。


3. 为什么需要 --mount-proc

/proc 是 Linux 的虚拟文件系统,存储了进程和系统信息(如 /proc/PID 目录)。关键问题

  • 默认 /proc 不隔离 :若不重新挂载 /proc,新 PID 命名空间中的进程仍会看到原系统的所有进程信息(即 /proc 包含全局进程)。

  • 工具依赖 /procpstop 等命令通过读取 /proc 获取进程信息,若未隔离,这些工具会显示原系统的进程,而非当前命名空间的进程。

--mount-proc 的作用

自动将 /proc 文件系统挂载到新命名空间的 /proc 目录,确保:

  • 隔离的进程信息:仅显示当前 PID 命名空间及其子命名空间的进程。

  • 挂载隔离 :虽然未显式创建新的 mount 命名空间,但 --mount-proc 会在新 PID 命名空间内重新挂载 /proc,使其独立于原系统

案例三:mount 隔离

bash 复制代码
#开启mount 隔离
unshare -m --fork /bin/bash
#创建镜像文件
dd if=/mnt/zero of=test2.img bs=8k count=1024
#格式化文件
mkfs -t ext4 /docker/test2.img
#创建要挂载的目录
mkdir -p /mnt/testext4
#将文件系统挂载到创建的目录上
mount -t ext4 /dockertest/test2.img ./testext4

二、pidstat

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

语法:

bash 复制代码
pidstat [选项] [<时间间隔>] [<次数>]

参数:

  • -u:默认参数,显示各进程的 CPU 使用统计
  • -r:显示各进程的内存使用统计
  • -d:显示各进程的 IO 使用情况
  • -p:指定进程号,ALL 表示所有进程
  • -C:指定命令(stress 监控 stress 命令相关进程的状态)
  • -l:显示命令名和所有参数

安装:

bash 复制代码
#ubuntu 卸载
apt remove sysstat -y
#ubuntu 安装
apt install stsstat -y

#centos 卸载
yum remove sysstat -y
#centos 安装
yum install sysstat -y

三、stress

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

语法:

bash 复制代码
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:程序在运行的过程中不输出信息

安装:

bash 复制代码
#ubuntu 卸载
apt remove stress -y
#ubuntu 安装
apt install stress -y

#centos 卸载
yum remove stress -y
#centos 安装
yum install stress -y

四、cgroup

4.1 信息查看

bash 复制代码
#查看当前系统操作系统版本
cat /etc/*release*
#版本查看
cat /proc/filesystems |grep cgroup
#cgroups 子系统查看
cat /proc/cgroups
#cgroups 挂载信息查看(cgroup2 on /sys/fs/cgroup type cgroup2)表示cgroup 挂载到了 /sys/fs/cgroup 目录
mount | grep cgroup
#查看一个当前进程的 cgroup 限制
cat /proc/$$/cgroup
#(0::/user.slice/user-0.slice/session-33754.scope)当前进程 cgroup信息在 cgroup 挂载目录中的/user.slice/user-0.slice/session-33754.scope

cgroup2 如何配置:

bash 复制代码
# 限制为 1 个核心的 20%
echo "20000 100000" > cpu.max

# 限制内存使用为 1GB
echo "1073741824" > memory.max

# 最多允许 100 个进程
echo "100" > pids.max

注意:cgroup 配置会继承父层级的限制。若当前配置信息不生效,可以返回上级目录,查看父目录的配置信息

4.2 使用 cgroups 对内存进行控制

bash 复制代码
#在 cgroup 挂载目录创建文件,作为限制模板
mkdir cgrouptest

#限制 cpu 使用率为 50%
echo 50000 100000 > cpu.max

#限制内存使用最大为 20 m 20*1024*1024
echo "20971520" > memory.max

#将要限制的进程写入 cgroup.procs 中
echo 2603690 > cgroup.procs

我们可以使用如下命令验证 cgroup 是否生效

bash 复制代码
#不停的申请回收 100m 内存
stress --vm 1 --vm-bytes 100m
#监控对应的进程
pidstat -C stress -p ALL  -r 2 1000
#当我们把对应进程号加入 cgroup.procs 中,此时就会停止申请和释放内存
相关推荐
大树883 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz3 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工4 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智5 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩5 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_5 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化