docker 虚拟化

docker 虚拟化

容器技术

Cgroup技术是用来制造约束的主要手段,而Namespace 技术是用来修改进程视图的主要方法。

优点: 轻量

与真正的虚拟化技术不同,虚拟化技术是必须要有Hypervisor 来负责创建虚拟机,这个虚拟机是真实存在的,并且这个虚拟机里面必须运行一个完整的Guest OS 才能执行用户的应用进程。通过虚拟化真实的底层硬件指令来完成 。因此不可避免的带来了额外的资源消耗。

缺点:隔离不彻底

容器是公用一个宿主机的,只是通过操作系统提供的能力将各个资源隔离开,但是其实内核都是使用的是同一个。像时钟资源是不可以被隔离的,只要容器中改了时钟,整个宿主机都会受到影响

Cgrop:

linux Cgroup 全程是 linux control Group.主要作用是限制一个进程组能够使用的资源上限,包括CPU,内存、磁盘、网络带宽等等。以及还能够将进程进行优先级设置、审计,以及挂起和恢复等操作

madv_free 在linux 4.5以上的内核才会使用,一般默认是

Cgroup 给用户暴露出来的操作接口是文件系统,就是说它是以文件的方式组织在操作系统的/sys/fs/group 路径下,通过mount -t cgroup 来展示

红框画起来的像cpuset,memory 这样的子目录也叫子系统。这些都是当前这台机器可以被Cgroup进行限制的资源种类,在该子系统对于的资源种类下,客户看到该类型资源具体可以被限制的方法。

cpu.cfs_period_uscpu.cfs_quota_us 就是用来限制进程在cfs_period_us 的一段时间内,只能分配 cfs_quota_us 的cpu 时间。

那么怎么使用呢?

在对应的资源下床一个一个目录,比如创建一个test 目录,这个目录叫控制组

cd /sys/fs/cgroup/cpu
mkdir test

会发现,操作系统会在新创建的test 目录下自动生成该子系统对于的资源限制文件

查看test目录下 cfs_period_uscfs_quota_us 的内容,分别是

说明cpu period 是100ms(100000 us), quota_us 是没有限制(-1),接下来修改文件内容

#将-1 改为 20ms,也就是每100ms的时间里,被该控制组限制的进程只能使用20ms的cpu 时间(20%cpu)
echo 20000 > /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us
#将需要被限制的进程pid 写入test组的tasks 文件,上面设置就会生效
echo $pid > /sys/fs/cgroup/cpu/test/tasks

除了以上的资源限制,还有经常用到的

  • blkiod, 为块设备设定I/O限制,用于磁盘等设备
  • cpuset 为进程分配单独的cpu核和对应的内存节点;
  • memory,为进程设定内存使用的限制

Namespace

当我们启动一个docker 容器的时候,通过 ps -ef 发现只有我们docker 容器里面启动的时候的进程,且pid 还是1还有一个就是ps 进程。其他所有的该操作系统上的进程全部都不见了。这种隔离技术就是linux里面的 Namespace 技术。

Namespace 的使用方式:其实就是linux 创建进程的一个可选参数。

当我们要创建进程的时候需要通过clone 系统调用创建一个进程,这个时候就可以在参数中指定

CLONE_NEWPID 参数

//CLONE_NEWPID 参数会让新创建的进程看到一个全新的进程空间
int pid = clone(main_function,stack_size,CLONE_NEWPID | SIGCHLD,NULL) 

目前 linux 内核主要实现了一下几种不同的资源 namespace:

namespace资源

参考

Linux资源管理之cgroups简介

虚拟化介绍:https://blog.selectel.com/containerization-mechanisms-namespaces/

Docker 容器化技术: https://cizixs.com/2017/08/29/linux-namespace/

posted @ 2022-03-23 09:21  zhqqqy  阅读(57)  评论(0编辑  收藏  举报