傻大方


首页 > 学习 >

Docker|Docker容器原理与实现( 二 )



按关键词阅读: 原理 实现 容器 Docker


各种类型namespace实现的功能和发行系统版本关系如下:Namespace系统调用参数隔离内容内核版本MountCLONE_NEWNS挂载点(文 件系统)Linux2.4.19UTSCLONE_NEWUTS主机名与 域名Linux2. 6. 19IPCCLONE_NEWIPC进程间通 信Linux2. 6. 19PIDCLONE_NEWPID进程编号Linux2. 6. 24 。

10、NetworkCLONE_NEWNET网络设备、 网络栈、端 口等Linux2. 6. 29UserCLONE_NEWUSER用户和用 户组Linux 3. 8F面利用一个简单程序 , 剖析使用namespace进行资源隔离的方法 。
代码如下:#define STACKSI2E (1024 * 1024)static char child_stackSTACK_SIZE;
int child(voidr args) printf(Menter namespace!nn);
sethostname(container” , 12);
chroot (,/home/containerw);
mount (none 。


11、 , /proc , proc , C,NULL);
mount (nnonen/ VsysNULL);
execv CVbin/bash”t NULL);
return 1;
int main(int argc, char *Targv) int child_pid = clone(child, child_stack + STACK_SIZEzCLONE_NEWNS I CLCNEnEWUTS I CLONE_NEWPID I SIGCHLD, NULL); printf(nchild_pid:%dnMz child_pid);
waitpid(child_pid/ NULL, 0);
printf(Mquit。

12、namespace!nn);
return 0;
)执行这段c语言代码会建立了一个namespace,这个namespace的初始化进程是bash,用ps命令查看bash 对应的进程号为lo代码显示的3591进程号是指这个bash进程在物理机系统的进程号 。
rootcentos-l home# ./demons.outchild_pid:3591enter namespace!bash-4.lfr ps -efU工DPHD PP1D C ST工ME TTY-ME CMD0100 13:23 ?00:00:00 bash0210 13:23 ?00:00:00 ps -ef从物理机Linux系统看 , 执 。

13、行c语言的进程号是3590, namespace 中 bash 的进程号是 3591 。
rootcentos-l ps -ef | grep 3590 | grep -v grep root3590 2732 0 21:23 pts/000:00:00 ./demons.outroot3591 3590 0 21:23 pts/000:00:00 bash从执行结果看 , 程序对挂载点、主机名和进程等进 行namespace隔离 。
程序运行后 , sethostname将主机名修改为container,物理机linux主机名仍然为 centos-1; namespace内进程与物理机linux系统之间的进 。

14、程也进行了隔离 , 这个namespace进程就形成了一 个容器的最小内核 。
如果需要这个容器具有更多的功能 模块 , 可以在容器的文件系统(对应物理机 /home/container以下目录)创建对应shell命令或者 应用程序 。
这样 , 这个namespace小程序启动后 , 系统 就会出现一个功能比较丰富的容器环境 。
在完整docker实际运行环境 , 系统将各种功能代码封装到一个镜像文件中 , 再采用aufs挂载的方式提 供给容器使用 。
这样既满足功能要求 , 又提升了发布和 迁移的效率 。
3、LXC的资源配额采用chroot和namespace,系统实现了对容器的进 程、主机名、文件系统、网络等资源隔离 , 但是容器仍 然 。

15、可以没有限制地使用所有资源 。
此时 , 如果物理机同 时运行多个容器 , 就存在抢占资源 , 导致物理机瘫痪的 风险 。
所以 , 要实现一个强壮的容器 , 就必须对容器使 用的资源进行配额管理 。
cgroups是Linux内核提供限制进程资源的一种机制 , 可以用于对CPU和内存等资源的精细化控制 。
开发 者利用cgroups可以限制进程资源的使用 , 比如:cgroups可以将应用消耗的计算资源限制某几个CPU、甚至某个CPU的特定比率 。
Docker也就使用了 cgroups来完成cpu和内存等部分的资源控制 。
F面这段C程序 , 先打印出运行进程号 , 接着的死循环会消耗大量CPU资源 。
int main(void) printf (, 。

16、lpid:%dnnz getpid ();
long n=0;
for(;
) n+; return 0;
程序运行后 , 进程号是13649,结果如下:rootcento5-l home# ./eatcpu.out pid:13649再用top命令 , 查看系统cpu资源情况发现 , 13649 进程消耗了一核CPU的99. 8%oPID USER13649 root1 root200 3920 416 344 R99.80.0200 19352 1540 1224 S 0.0 0.13:04.60 eatcpu.out0:01.52 initPR NI VIRT RES SHR S %CPU %MEMTIME 。

17、4- COMMAND通过使用cgroups机制可以限制上述死循环程序占用CPU资源的上限 。
具体操作是在“/cgroup/cpu”目 录新建eatcpugroup目录 , 并把要控制的cpu上限值30000 (表示30%使用上限)和进程号13649加入acpu. cfs_quota_us和“tasks”这两个文件 。
脚本如下:#!/bin/bashPID=13649QUOTA=30000mkdir -p /cgroup/cpu/eatcpugroupecho Squota /cgroup/cpu/eatcpugroup/cpu.cfs_quota_usecho $PID /cgroup/cpu/eat 。

18、cpugroup/tasks针对13649进程cgroup机制建立后 , 13649进程CPU消耗了下降到30. 6%oPID USERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND13649 root200 3920 416 344 R30.60.01 root200 19352 1540 1224 S 0.0 0.13:04.60 eatcpu.out0:01.52 init除对CPU使用率进行限制外 , cgroup还具有利用memory子系统限制进程的内存使用量、利用blkio子系统限制进程的块设备读写、利用devices子系统控制进程能够访问的设备、 。


稿源:(未知)

【傻大方】网址:/a/2021/0905/0024106853.html

标题:Docker|Docker容器原理与实现( 二 )


上一篇:DI|DI即时挑战题选编——任务类

下一篇:六一儿童节|六一儿童节演讲稿三篇