在前面几部分的基础上, 我们更新一下代码,实现一个简单容器 sdocker.

sdocker目录构成

linux: # tree
.
├── Makefile
├── cpu-test.c # 由cpu.c重命名
├── memory-test.cpp # 由memory.cpp重命名
├── resource.c # 新增用于资源管理
├── resource.h
├── sdocker_exec.c # 模拟 docker exec
└── sdocker_run.c # 由namespace.c更新而来, 模拟 docker run directories, files
linux: #

修改点

. 更新rootfs:
a) 拷贝cpu-test/memory-test到rootfs/bin目录下, 对应的依赖库也按照先前文章介绍的方法拷贝到rootfs对应路径,方便后续进行cpu和memory测试;
b) rootfs增加拷贝top命令, 方便查看cpu使用率;
c) 增加rootfs/root/.bashrc, 用于设置容器的提示符, 内容如下所示:
linux:~ # cat /var/lib/sdocker/rootfs/root/.bashrc
export PS1="\h:\w $ "
linux:~ # sdocker启动后的终端提示符如下所示(主机名@容器id: 路径):
sdocker@:/ $ . 增加sdocker_run程序:
a) 增加cgroup资源管理文件resource.c, 可以设置memory.limit_in_bytes, memory.swappiness, cpu.cfs_period_us, cpu.cfs_quota_us.
资源管理会在启动容器进程后在/sys/fs/cgroup/{cpu,memory}下建立目录名为容器id的目录, 程序结束后删除.
b) 增加信号量和共享内存, 用于主进程和容器进程间传递数据(比如容器id和rootfs路径);
c) 把proc, sys, dev, dev/pts这些都挂载到容器;
d) 默认启动的容器mount-propagation type是MS_SHARED, 容器进程mount操作在主机可见, 为了让容器mount操作主机不可见, 设置容器的propagation type为MS_PRIVATE; . 增加sdocker_exec程序, 通过注入namespace方式实现类似docker exec功能

基础验证

########### 启动容器, 默认执行bash ###########
linux: # ./sdocker_run -h Usage: sdocker [OPTIONS] IMAGE Start a container using bash default Options:
-c, --cpu-test start cpu test with high cpu program
-m, --memory-test start memory test with high memory program
-n, --hostname string docker hostname, default is sdocker
--memory-limit bytes Memory limit, file: memory.limit_in_bytes
--memory-swappiness int Tune container memory swappiness ( to ) , file: memory.swappiness
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period, file: cpu.cfs_period_us
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota, file: cpu.cfs_quota_us
-h, --help show help linux: # ./sdocker_run /var/lib/sdocker/rootfs/
[+] start container with id
sdocker@:/ $ ps -ef
UID PID PPID C STIME TTY TIME CMD
: pts/ :: /bin/bash
: pts/ :: ps -ef
sdocker@:/ $ ########### 启动另一个终端查看 ###########
linux: # ls /sys/fs/cgroup/{cpu,memory}
/sys/fs/cgroup/cpu:
cpu.cfs_period_us cpu.shares cpuacct.usage_percpu
cgroup.clone_children cpu.cfs_quota_us cpu.stat notify_on_release
cgroup.procs cpu.rt_period_us cpuacct.stat release_agent
cgroup.sane_behavior cpu.rt_runtime_us cpuacct.usage tasks /sys/fs/cgroup/memory:
memory.low_limit_in_bytes memory.swappiness
cgroup.clone_children memory.max_usage_in_bytes memory.usage_in_bytes
cgroup.event_control memory.move_charge_at_immigrate memory.use_hierarchy
cgroup.procs memory.numa_stat notify_on_release
cgroup.sane_behavior memory.oom_control release_agent
memory.failcnt memory.pressure_level tasks
memory.force_empty memory.soft_limit_in_bytes
memory.limit_in_bytes memory.stat
linux: # ./sdocker_exec /var/lib/sdocker/rootfs/
sdocker@:/ $ ps -ef
UID PID PPID C STIME TTY TIME CMD
: pts/ :: /bin/bash
: pts/ :: bash
: pts/ :: ps -ef
sdocker@:/ $ exit
exit
linux: #

无资源限制测试cpu-test

########### 启动容器执行cpu-test, 理论cpu占用要到100% ###########
linux: # ./sdocker_run -c /var/lib/sdocker/rootfs/
[+] start container with id ########### 启动另一个终端查看 ###########
linux: # ./sdocker_exec /var/lib/sdocker/rootfs/
sdocker@:/ $ ps -ef
UID PID PPID C STIME TTY TIME CMD
: pts/ :: /bin/cpu-test
: pts/ :: bash
: pts/ :: ps -ef
$sdocker@:/ $ top
top - :: up day, min, users, load average: 0.96, 0.47, 0.19
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: total, used, free, buffers
KiB Swap: total, used, free. cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
R 100.00 0.001 :03.84 cpu-test
S 0.000 0.009 :00.00 bash
R 0.000 0.006 :00.00 top
sdocker@:/ $ exit
exit
linux: #

有资源限制测试cpu-test, 限制cpu使用率20%

########### 启动容器执行cpu-test, 设置cpu占用率不超过20% ###########
linux: # ./sdocker_run -c --cpu-quota /var/lib/sdocker/rootfs/
[+] start container with id ########### 启动另一个终端查看 ###########
linux: # ./sdocker_exec /var/lib/sdocker/rootfs/
sdocker@:/ $ ps -ef
UID PID PPID C STIME TTY TIME CMD
: pts/ :: /bin/cpu-test
: pts/ :: bash
: pts/ :: ps -ef
sdocker@:/ $ top
top - :: up day, min, users, load average: 0.31, 0.66, 0.40
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 1.2 us, 0.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: total, used, free, buffers
KiB Swap: total, used, free. cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
R 20.333 0.001 :06.46 cpu-test
S 0.000 0.009 :00.00 bash
R 0.000 0.006 :00.00 top
sdocker@:/ $ exit
exit
linux: #

有资源限制测试memory-test, 设置内存使用上限10M, 并关闭 swap

########### 启动容器执行memory-test, 设置memory使用不超过10M, 一段时间后容器触发oom退出 ###########
linux: # ./sdocker_run --memory-test --memory-limit --memory-swappiness /var/lib/sdocker/rootfs/
[+] start container with id
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
[+] malloc size:
linux: # ps -ef | grep sdocker | grep -v grep
linux: # ########### 启动另一个终端查看, 一段时间后容器退出 ###########
linux: # ./sdocker_exec /var/lib/sdocker/rootfs/
sdocker@:/ $ ps -ef
UID PID PPID C STIME TTY TIME CMD
: pts/ :: /bin/memory-test
: pts/ :: bash
: pts/ :: ps -ef
sdocker@:/ $

容器基础(五): 实现一个简单容器sdocker的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  2. [安卓基础] 005.创建一个简单的UI

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译

    一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...

  4. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  5. Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器

    新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView  两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...

  6. Away3d 基础 1 ---对一个简单类的解释

    转自:http://www.cnblogs.com/nooon/archive/2009/05/16/1458334.html 原英文地址: http://www.flashmagazine.com/ ...

  7. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  8. mxnet:基础知识和一个简单的示例

    NDArray与NumPy的多维数组类似,但NDArray提供了更多的功能:GPU和CPU的异步计算:自动求导.这使得NDArray能更好地支持机器学习. 初始化 from mxnet import ...

  9. 03-运行第一个docker容器

    环境选择 容器需要管理工具.runtime 和操作系统,我们的选择如下: 1.管理工具 - Docker Engine因为 Docker 最流行使用最广泛. 2.runtime - runc Dock ...

随机推荐

  1. SpringBoot非官方教程 | 第六篇:springboot整合mybatis

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-mybatis/ 本文出自方志朋的博客 本文主要 ...

  2. 为什么有IP还需要硬件地址,或者说为什么有硬件地址还需要IP

    只用MAC 虽然每个设备都有唯一的硬件地址,但不都是MAC格式. 只用MAC的话理论上是可行的,但是其中 兼容不同的硬件地址,处理起来是非常困难的.而且数据链路层也没有必要处理网络层的逻辑. 只用IP ...

  3. c/c++面试----c工程开发之头文件

    多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...

  4. vuex组件 vuex-persistedstate

    vuex用于管理项目中的全局状态,但是我们一刷新vuex中保存的全局状态就会被全部初始化,虽然我们也可以同事缓存到storage中做两步操作,但是vuex-persistedstate组件已经帮我们完 ...

  5. JS 定时器,定时调用PHP

    $(function() { var voiceplay=function(){ var site = location.href.split('_cms')[0] + '_cms/'; $.ajax ...

  6. Phpstudy2018 集成环境配置虚拟域名访问到Index Of 下

    (1)    Phpstudy是一款php集成开发环境 可随意切换Php的版本以及服务器. Phpstudy的网站根目录默认为WWW目录,那么如果我们想通过虚拟域名访问到Index Of目录来便于查看 ...

  7. sbt打包error(sbt.librarymanagement.ResolveException: unresolved dependency: org.apache.spark#spark-streaming;2.3.1: not found)

    解决方法: 修改simple.sbt文件: cd /usr/local/spark/myapp/TestStream vim simple.sbt 切记:中间相连部分两个百分号一定要写上

  8. python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

    什么是多任务? 简单地说,就是操作系统可以同时运行多个任务.实现多任务有多种方式,线程.进程.协程. 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任 ...

  9. 单片机C51 8位流水灯

    #include<reg51.h> sbit P1_0=0X90; sbit P1_1=0x91; sbit P1_2=0x92; sbit P1_3=0x93; sbit P1_4=0x ...

  10. kafka单机部署文档

    单机Kafka部署文档 最简单的使用方式,单机,使用自带的zookeeper 1.解压 下载地址:http://pan.baidu.com/s/1i4K2pXr tar –zxvf kafka_2.1 ...