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