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_us
和 cpu.cfs_quota_us
就是用来限制进程在cfs_period_us
的一段时间内,只能分配 cfs_quota_us
的cpu 时间。
那么怎么使用呢?
在对应的资源下床一个一个目录,比如创建一个test 目录,这个目录叫控制组
cd /sys/fs/cgroup/cpu
mkdir test
会发现,操作系统会在新创建的test 目录下自动生成该子系统对于的资源限制文件
查看test目录下 cfs_period_us
和 cfs_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:
参考
虚拟化介绍:https://blog.selectel.com/containerization-mechanisms-namespaces/
Docker 容器化技术: https://cizixs.com/2017/08/29/linux-namespace/