【Docker】0.空间资源隔离

NameSpace

dd + option : 可以从标准输入或文件中读取数据,根据指定格式来转换数据,再输出到文件、设备或标准输出
--help 显示帮助信息
--version 显示版本信息
if=文件名(输出文件名,默认标准输入) 源文件
of=文件名(输出文件名,默认标准输出) 目的文件
ibs=bytes 一次读取bytes个字节
obs=bytes 一次输出bytes个字节
bs=bytes  同时设置ibs和obs
cbs=bytes 一次转换bytes个字节
skip=blocks 从输入文件开头跳过blocks个块后开始复制
seek=blocks 从输出文件开头跳过blocks个块后开始复制
count=blocks 拷贝blocks个块,块大小等于ibs指定的字节数
conv=<关键字>
▪ conversion:用指定的参数转换文件。
▪ ascii:转换 ebcdic 为 ascii
▪ ebcdic:转换 ascii 为 ebcdic
▪ ibm:转换 ascii 为 alternate ebcdic
▪ block:把每一行转换为长度为 cbs,不足部分用空格填充
▪ unblock:使每一行的长度都为 cbs,不足部分用空格填充
▪ lcase:把大写字符转换为小写字符
▪ ucase:把小写字符转换为大写字符
▪ swap:交换输入的每对字节
▪ noerror:出错时不停止
▪ notrunc:不截短输出文件
▪ sync:将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐。


@example 
# 从/dev/zero 中读取10240 8k的page到fdimage.img中
dd if=/dev/zero of=fdimage.img bs=8k count=10240
# 将testfile 文件中的英文字母转换成大写,并输出到testfile_1文件中
dd if=testfile_2 of=testfile_1 conv=ucase



mkfs [-V][-t fstype][fs-options] filesys [blocks] : 格式化文件
@example
# 格式化镜像文件ext4
mkfs -t ext4 ./data1.img

df [option]...[file](disk free 磁盘空间)显示Linux系统上的文件系统磁盘使用情况
* -a(all) 包含所有具有0 Blocks的文件系统
* -h(human-readable)
* -H(单位1000)
* --type=TYPE(指定文件系统TYPE)
* -T 显示文件系统的形式
@example
df -h 查看磁盘使用情况 df -Th 查看磁盘的系统类型

mount命令:可以用于加载文件系统到指定加载点。常用于挂载关盘,使我们可以访问光盘中的数据。因为关盘插入光驱中,Linux并不会自动进行挂载,必须使用Linux mount命令手动完成挂载
Linux系统不同目录下可以挂载不同分区和磁盘设备,它的目录和磁盘分区时分离的,可以自由组合
不同目录数据可以跨越不同磁盘分区或者不同磁盘设备
挂载的本质就是为磁盘添加入口(挂载点)

@example
mount [-l] 									显示已经加载的文件系统		
mount [-t vfstype] [-o options] device dir     -t指定文件系统类型,可以不指定,会自动识别
# 将镜像挂载到/mnt/test4下面,确保挂载点也就是目录存在
mount ./fdimage.img  /mnt/test4

unshare 主要能力是使用父进程不共享的名称空间运行程序
unshare [options] program [arguments]
这里主要介绍几个重要参数
-m,--mount   不共享mount空间,父进程不能看到该命名空间中的mount空间
--fork       执行unshare递达进程fork一个新的子进程,再子进程中执行unshare传入的参数
--mount-proc 执行子进程前,将proc优先挂载过去

@example
unshare -u /bin/bash                          用户隔离
unshare --fork --pid --mount-proc /bin/bash   PID隔离


*** 注意:
1、--fork 新建一个bash进程,如果不新建进程,新的namespace就会使用unshare的PID作为新的空间的父进程,而unshare进程并不在新的namespace中,所以会报Cannot allocate memory
2、mount-proc 是因为Linux下每个进程都有一个对应的/proc/PID目录,该目录中包含大量当前进程的信息,对一个PID namespace 而言。创建一个新的PID namespace后,如果向让子进程中ll、to等指令依赖/proc文件系统的命令工作,需要挂载/proc文件系统。而文件系统隔离是mount namespace管理的,所以Linux特意提供了一个选项--mount-proc来解决这个问题。如果不带这个我们看到的进程还是系统的进程信息
NameSpace Actual Conbat

打开shell窗口A,执行df -h 查看主机默认命名空间的磁盘挂载情况

[root@VM-20-6-centos data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G   24K  1.9G   1% /dev/shm
tmpfs           1.9G  3.9M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/vda1        59G   23G   34G  41% /
tmpfs           370M     0  370M   0% /run/user/0
tmpfs           370M     0  370M   0% /run/user/1001
/dev/loop0      6.8M   77K  6.2M   2% /data/testmymount

打开一个新的shell窗口,执行mount隔离命令

[root@VM-20-6-centos ~]# unshare --mount --fork /bin/bash    #表示创建子进程并隔离mount命名空间
[root@VM-20-6-centos ~]# mkdir -p /data/tmpmount		


添加新的磁盘挂载,并添加文件

[root@VM-20-6-centos ~]# cd /data/tmpmount/
[root@VM-20-6-centos ~]# dd if=/dev/zero of=fdimage.img bs=8k count=10240
[root@VM-20-6-centos tmpmount]# mount ./fdimage.img /data/tmpmount
[root@VM-20-6-centos tmpmount]# echo "hello world" > test.txt

分别在两个窗口中查看挂载信息,并查看文件。可以观察到两者观察到的目录内文件并不相同,说明我们实现了文件系统的隔离

[root@VM-20-6-centos tmpmount]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        59G   23G   34G  41% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G   24K  1.9G   1% /dev/shm
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           1.9G  3.9M  1.9G   1% /run
tmpfs           370M     0  370M   0% /run/user/0
tmpfs           370M     0  370M   0% /run/user/1001
/dev/loop0      6.8M   77K  6.2M   2% /data/testmymount
/dev/loop1       74M  1.6M   67M   3% /data/tmpmount

[root@VM-20-6-centos tmpmount]# ll
total 4492
-rw-r--r-- 1 root root 83886080 May 25 19:38 fdimage.img
-rw-r--r-- 1 root root       12 May 25 19:35 test.txt

[root@VM-20-6-centos tmpmount]# ll
total 13
drwx------ 2 root root 12288 May 25 19:34 lost+found
-rw-r--r-- 1 root root    12 May 25 19:38 test.txt

CGroups

pidstat 是sysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况,用户可以通过指定的统计次数和时间来获得所需的统计信息

pidstat [option][<time interval>][<times>]
# 安装: yum install sysstat -y
# 卸载: yum remove sysstat -y
@example
pidstat -C stress -p ALL -u 2 100000 # 每两秒监控stress命令全部进程cpu使用,监视100000次

stress 是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘等进行压力测试
stress [OPTION[ARG]]
-c --cpu N :产生N个进程,每个进程都训话你调用sqrt函数压力CPU
-i --io N :产生N个进程,每个进程循环调用sync将内存缓冲区内容写道磁盘上,产生IO压力
-m --vm N :产生N个进程,每个进程频繁调用malloc/free来分配释放内存

查看cgroups版本

[root@VM-20-6-centos tmpmount]# cat /proc/filesystems | grep cgroup 
nodev	cgroup

cgroups子系统查看

[root@VM-20-6-centos tmpmount]# cat /proc/cgroups
#subsys_name	hierarchy	num_cgroups	enabled
cpuset	5	2	1
cpu	2	186	1
cpuacct	2	186	1
memory	4	186	1
devices	7	167	1
freezer	3	2	1
net_cls	6	2	1
blkio	11	167	1
perf_event	8	2	1
hugetlb	10	2	1
pids	9	167	1
net_prio	6	2	1


cgroups挂载信息查看

[root@VM-20-6-centos tmpmount]# ls /sys/fs/cgroup
blkio  cpuacct      cpuset   freezer  memory   net_cls,net_prio  perf_event  systemd
cpu    cpu,cpuacct  devices  hugetlb  net_cls  net_prio          pids

查看一个进程上cgroup限制

# 以当前shell进程为例,查看进程cgrouup
[root@VM-20-6-centos tmpmount]# cat /proc/$$/cgroup
11:blkio:/user.slice
10:hugetlb:/
9:pids:/user.slice
8:perf_event:/
7:devices:/user.slice
6:net_prio,net_cls:/
5:cpuset:/
4:memory:/user.slice
3:freezer:/
2:cpuacct,cpu:/user.slice
1:name=systemd:/user.slice/user-1001.slice/session-1217342.scope
# 可以组合mount | grep cgroup 来查找控制信息

[root@VM-20-6-centos 7058]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

[root@VM-20-6-centos 7058]# ll /sys/fs/cgroup/cpu,cpuacct/user.slice
total 0
-rw-r--r-- 1 root root 0 May 17 17:22 cgroup.clone_children
--w--w--w- 1 root root 0 May 17 17:22 cgroup.event_control
-rw-r--r-- 1 root root 0 May 17 17:22 cgroup.procs
-r--r--r-- 1 root root 0 May 17 17:22 cpuacct.stat
-rw-r--r-- 1 root root 0 May 17 17:22 cpuacct.usage
-r--r--r-- 1 root root 0 May 17 17:22 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_period_us    # CPU总时间片
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.cfs_quota_us     # 该进程占用时间片 -1代表不受cgroup控制
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_period_us
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 May 17 17:22 cpu.shares
-r--r--r-- 1 root root 0 May 17 17:22 cpu.stat
-rw-r--r-- 1 root root 0 May 17 17:22 notify_on_release
-rw-r--r-- 1 root root 0 May 17 17:22 tasks

Cgroup Control Memory
[root@VM-20-6-centos 7058]# mount | grep cgroup  # 找到控制内存信息的文件
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) # 这个
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

[root@VM-20-6-centos 7058]# cd /sys/fs/cgroup/memory 
[root@VM-20-6-centos memory]# mkdir test_memlimit     # 系统会为我们自动配置文件

[root@VM-20-6-centos test_memlimit]# ls  # 重点关注limit_in_bytes空间上线 和 tasks(任务) 
cgroup.clone_children           memory.kmem.tcp.max_usage_in_bytes  memory.oom_control
cgroup.event_control            memory.kmem.tcp.usage_in_bytes      memory.pressure_level
cgroup.procs                    memory.kmem.usage_in_bytes          memory.soft_limit_in_bytes
memory.failcnt                  memory.limit_in_bytes               memory.stat
memory.force_empty              memory.max_usage_in_bytes           memory.swappiness
memory.kmem.failcnt             memory.memsw.failcnt                memory.usage_in_bytes
memory.kmem.limit_in_bytes      memory.memsw.limit_in_bytes         memory.use_hierarchy
memory.kmem.max_usage_in_bytes  memory.memsw.max_usage_in_bytes     notify_on_release
memory.kmem.slabinfo            memory.memsw.usage_in_bytes         tasks
memory.kmem.tcp.failcnt         memory.move_charge_at_immigrate
memory.kmem.tcp.limit_in_bytes  memory.numa_stat

[root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes   # 可以看到内存是不上限的
9223372036854771712
[root@VM-20-6-centos test_memlimit]# echo "20971520" > memory.limit_in_bytes  # 将其设置为20M
[root@VM-20-6-centos test_memlimit]# cat memory.limit_in_bytes 
20971520


新建两个终端进行压力测试

# 终端1
[clx@VM-20-6-centos test_memlimit]$ stress -m 1 --vm-bytes 50m
stress: info: [1851] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1851] (415) <-- worker 1852 got signal 9
stress: WARN: [1851] (417) now reaping child worker processes
#  压力测试退出
stress: FAIL: [1851] (451) failed run completed in 139s

# 终端2
08:30:29 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:30:31 PM  1001      1851      0.00      0.00   10428    456   0.01  stress
08:30:31 PM  1001      1852 244557.00      0.00   61632  11324   0.30  stress

08:30:31 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:30:33 PM  1001      1851      0.00      0.00   10428    456   0.01  stress
08:30:33 PM  1001      1852 240434.00      0.00   61632  29280   0.77  stress

# 此时在终端0中将 1852 移入tasks中,压力测试立马退出
08:30:33 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
Cgroup Control CPU
[clx@VM-20-6-centos test_memlimit]$ mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) # 这个
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

[root@VM-20-6-centos test_memlimit]# cd /sys/fs/cgroup/cpu,cpuacct
[root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_period_us   # 默认带宽,单位为微秒
100000
[root@VM-20-6-centos cpu,cpuacct]# cat cpu.cfs_quota_us  # 目前不受cgroup控制
-1

[root@VM-20-6-centos cpu,cpuacct]# mkdir test_cpu
[root@VM-20-6-centos cpu,cpuacct]# cd test_cpu
[root@VM-20-6-centos test_cpu]# echo "20000" > cpu.cfs_quota_us 
[root@VM-20-6-centos test_cpu]# cat cpu.cfs_quota_us    # 设置CPU占用率为20% 
20000

新建两个终端进行压力测试

# 终端1
[root@VM-20-6-centos tmpmount]# stress --cpu 1
stress: info: [7206] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

# 终端2
[root@VM-20-6-centos tmpmount]# pidstat -C stress -p ALL -u  2 10000
# 开始7207进程CPU使用率接近100%
09:58:14 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command  
09:58:16 AM     0      7206    0.00    0.00    0.00    0.00     1  stress
09:58:16 AM     0      7207   97.50    0.00    0.00   97.50     0  stress

09:58:16 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:58:18 AM     0      7206    0.00    0.00    0.00    0.00     1  stress
09:58:18 AM     0      7207   81.50    0.50    0.00   82.00     1  stress
# 将7207进程写入到tasks中,可以看到该进程的CPU使用率最高只有20%了
09:58:18 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:58:20 AM     0      7206    0.00    0.00    0.00    0.00     1  stress
09:58:20 AM     0      7207   20.00    0.00    0.00   20.00     1  stress

# 终端0
[root@VM-20-6-centos test_cpu]# cat tasks;	
[root@VM-20-6-centos test_cpu]# echo "7207" > tasks

总结:docker的本质就是调用这些API来完成对资源的管理的,但docker的易用性和镜像的设计更加人性化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白在进击

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值