容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”.

1.namespace

linux通过命名空间对进程,做到视图隔离.一个拥有独立命名空间的程序看不到其他命名空间的程序.linux提供了clone命令,参数中可以指定namespace.

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);

     docker exec原理:

     我们可以通过setns系统命令,将一个进程加入到某个namespace,

 

2.cgroup

cgroup允许我们对进程使用的资源做出限制.例如cpu,内存,磁盘等等.

实验:

1.进入cgroup目录.可以看到在cgroup目录下,可以对哪些资源进行限制

[root@tv2-callchain-tool-02 cgroup]# ls /sys/fs/cgroup/
blkio  cpu  cpuacct  cpu,cpuacct  cpuset  devices  freezer  hugetlb  memory  net_cls  net_cls,net_prio  net_prio  perf_event  pids  systemd

2.新建一个控制组目录,操作系统就会给我们生成对应的目录

[root@tv2-callchain-tool-02 cpu]# mkdir ctest
[root@tv2-callchain-tool-02 cpu]# ll ctest/
total 0
-rw-r--r-- 1 root root 0 Nov 25 11:16 cgroup.clone_children
--w--w--w- 1 root root 0 Nov 25 11:16 cgroup.event_control
-rw-r--r-- 1 root root 0 Nov 25 11:16 cgroup.procs
-r--r--r-- 1 root root 0 Nov 25 11:16 cpuacct.stat
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpuacct.usage
-r--r--r-- 1 root root 0 Nov 25 11:16 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Nov 25 11:16 cpu.shares
-r--r--r-- 1 root root 0 Nov 25 11:16 cpu.stat
-rw-r--r-- 1 root root 0 Nov 25 11:16 notify_on_release
-rw-r--r-- 1 root root 0 Nov 25 11:16 tasks

如果我们再在这个目录底下创建目录呢?

[root@tv2-callchain-tool-02 cpu]# cd ctest/
[root@tv2-callchain-tool-02 ctest]# mkdir cchild_test
[root@tv2-callchain-tool-02 cchild_test]# ll /sys/fs/cgroup/cpu/ctest/cchild_test/
total 0
-rw-r--r-- 1 root root 0 Nov 25 11:20 cgroup.clone_children
--w--w--w- 1 root root 0 Nov 25 11:20 cgroup.event_control
-rw-r--r-- 1 root root 0 Nov 25 11:20 cgroup.procs
-r--r--r-- 1 root root 0 Nov 25 11:20 cpuacct.stat
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpuacct.usage
-r--r--r-- 1 root root 0 Nov 25 11:20 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Nov 25 11:20 cpu.shares
-r--r--r-- 1 root root 0 Nov 25 11:20 cpu.stat
-rw-r--r-- 1 root root 0 Nov 25 11:20 notify_on_release
-rw-r--r-- 1 root root 0 Nov 25 11:20 tasks

可以看到这个控制就是使用的目录结构来控制

[root@tv2-callchain-tool-02 cpu]# ls -R ctest/
ctest/:
cchild_test            cgroup.event_control  cpuacct.stat   cpuacct.usage_percpu  cpu.cfs_quota_us  cpu.rt_runtime_us  cpu.stat           tasks
cgroup.clone_children  cgroup.procs          cpuacct.usage  cpu.cfs_period_us     cpu.rt_period_us  cpu.shares         notify_on_release

ctest/cchild_test:
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

如果我们创建两个容器.

[root@tv2-callchain-tool-02 cpu]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8e361a99140a        busybox             "sh"                8 seconds ago       Up 8 seconds                            container2
54b4f023e028        busybox             "sh"                16 seconds ago      Up 16 seconds                           container
[root@tv2-callchain-tool-02 cpu]# ls -R /sys/fs/cgroup/cpu/docker/
/sys/fs/cgroup/cpu/docker/:
54b4f023e028cf83ca435581f29fd42e5cfbfab4fd03ae274c815eab812e5c65  cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
8e361a99140a9aa028b9318f45ed85a6f1eabe6ea9da63638b15b4431121a13f  cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

/sys/fs/cgroup/cpu/docker/54b4f023e028cf83ca435581f29fd42e5cfbfab4fd03ae274c815eab812e5c65:
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

/sys/fs/cgroup/cpu/docker/8e361a99140a9aa028b9318f45ed85a6f1eabe6ea9da63638b15b4431121a13f:
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

怎么做限制:

每个目录下都有一个tasks文件,里面可以存进程id.我们看下docker里是怎么存的.

[root@tv2-callchain-tool-02 docker]# cat /sys/fs/cgroup/cpu/docker/tasks
[root@tv2-callchain-tool-02 docker]# cat /sys/fs/cgroup/cpu/docker/54b4f023e028cf83ca435581f29fd42e5cfbfab4fd03ae274c815eab812e5c65/tasks
2753337
[root@tv2-callchain-tool-02 docker]# cat /sys/fs/cgroup/cpu/docker/8e361a99140a9aa028b9318f45ed85a6f1eabe6ea9da63638b15b4431121a13f/
cat: /sys/fs/cgroup/cpu/docker/8e361a99140a9aa028b9318f45ed85a6f1eabe6ea9da63638b15b4431121a13f/: Is a directory
[root@tv2-callchain-tool-02 docker]# cat /sys/fs/cgroup/cpu/docker/8e361a99140a9aa028b9318f45ed85a6f1eabe6ea9da63638b15b4431121a13f/tasks
2753446

可以看到:操作系统对docker本身这个进程没有做限制.但是docker启动的容器,做出了限制.容器的进程id分别为2753337 ,2753446.

具体的实验,可以参考左耳朵耗子 大神的实验.

参考:https://coolshell.cn/articles/17049.html

3.rootfs,aufs,overlayfs

aufs(advance union file system),联合文件系统,不同物理位置的目录合并mount到同一个目录中.参考docker 镜像原理.

但是当我进行测试的时候,发现一直报错

[root@tv2-callchain-tool-02 testAufs]# ls -R .
.:
a  b  c

./a:
a1  a2

./b:
b1  b2

./c:
[root@tv2-callchain-tool-02 testAufs]# mount -t aufs -o dirs=./a:./b none ./c
mount: unknown filesystem type 'aufs'

###这里报错,没有发现aufs文件系统#####

 原因:

       目前,linux操作系统默认已经使用 overlayfs,相比aufs,overlay实现更简洁. overlay介绍

docker 使用overlay文件系统来构建和管理镜像与容器的磁盘结构。具体使用可以参考博客();

联合文件系统就是可以把多个目录整合成一个目录,提供给用户.例如我们下载一个镜像,会下载多个文件,然后这几个文件可以整合起来.分层构建

[root@tv2-callchain-tool-02 overlay2]# ls -l /var/lib/docker/overlay2/
total 32
drwx------ 4 root root 4096 Nov 25 10:54 31f5988823e11f00a3768a6846cf893a034a422a0536b1cd83f411491d9d6444
drwx------ 4 root root 4096 Nov 25 10:54 31f5988823e11f00a3768a6846cf893a034a422a0536b1cd83f411491d9d6444-init
drwx------ 5 root root 4096 Nov 25 12:49 44f8d7c28f545bd10acaea67d7138774445389171a66b418dae0d83469c8e29b
drwx------ 4 root root 4096 Nov 25 12:49 44f8d7c28f545bd10acaea67d7138774445389171a66b418dae0d83469c8e29b-init
drwx------ 5 root root 4096 Nov 25 12:49 7c34c1a7b522c41468ab98a37d286eb1bf229417e524fd2ee779746d9e8452ee
drwx------ 4 root root 4096 Nov 25 12:49 7c34c1a7b522c41468ab98a37d286eb1bf229417e524fd2ee779746d9e8452ee-init
drwx------ 3 root root 4096 Nov 24 01:06 f372b41854fc9a3a184d50b2398b444b2265e9219e723312b826340c0a2245f5
drwx------ 2 root root 4096 Nov 25 12:49 l

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐