容器化技术(四):容器到底隔离了什么?
一、容器的本质是一个进程一个容器就如同你之前跑到一个虚拟机中的一个应用程序,比如跑一个Java程序。那么在容器中,主进程就是跑着你Java程序的这个Java进程,其他的进程都是围绕着这个主进程的,如果主进程失败了,那么这个容器就是失败的。二、容器中隔离了以下资源mnt: 存储net : 网络pid : 进程user:用户uts:主机名、域名等ipc:进程间的通信cgroups:隔离资源,如CPU、
一、容器的本质是一个进程
一个容器就如同你之前跑到一个虚拟机中的一个应用程序,比如跑一个Java程序。那么在容器中,主进程就是跑着你Java程序的这个Java进程,其他的进程都是围绕着这个主进程的,如果主进程失败了,那么这个容器就是失败的。
二、容器中隔离了以下资源
- mnt: 存储
- net : 网络
- pid : 进程
- user:用户
- uts :主机名、域名等
- ipc :进程间的通信
- cgroups:隔离资源,如CPU、Memory
如果对这些特性感觉有些陌生,这很正常,我们可以通过创建一个容器,然后登录到容器中,查看对应的指标,感受容器对各种资源的隔离。
我们打开两个窗口,在窗口一执行以下命令:
docker run -it --name centos1 centos:7 /bin/sh
在窗口二执行以下命令:
docker run -it --name centos2 centos:7 /bin/sh
1、存储
在第一个容器中加入一个文件hello,并查看文件:
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
sh-4.2# touch hello
sh-4.2# ls
anaconda-post.log bin dev etc hello home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
在第二个容器中,查看文件结构:
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
可以看到,第一个容器中创建的文件,在第二个容器当中是无法查看到的,这就是存储方面的隔离。
2、网络
通过docker inspect命令来查看两个容器的ip,如下所示,第一个容器的IP是172.17.0.2。
➜ ~ docker inspect centos1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
通过命令查看第二个容器的IP,为172.17.0.3。与第一个容器是隔离的。
➜ ~ docker inspect centos2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
3、user
我们使用命令useradd,在第一个容器中添加了一个用户jxl,并使用su命令切换到用户jxl,如下所示:
sh-4.2# useradd jxl
sh-4.2# su jxl
[jxl@92b722a79582 /]$ whoami
jxl
在第二个容器中,我们切换到用户jxl上去,结果提示没有这个用户。
sh-4.2# su jxl
su: user jxl does not exist
4、uts
在第一个容器中查询主机名字:
[jxl@92b722a79582 /]$ hostname
92b722a79582
在第二个容器中查询主机名字:
sh-4.2# hostname
6da17ebcfb66
两个容器的主机名都是各自管理,独立的。
5、pid
容器中的进程是在我们看来都是各自在各自的容器中,下图是第一个容器的top命令的截图:
下面是第二个容器的top命令的截图:
两个容器中的1号进程,都是我们的sh命令行进程,虽然是同样的进程号,但是在各自的容器中。
6、CGroups
CGroups是隔离进程的使用资源的,如CPU、内存等。
在/sys/fs/cgroup/目录下面有如下的资源信息:
[root@kubernetes-master01 cgroup]# ll
总用量 0
drwxr-xr-x. 5 root root 0 3月 16 18:10 blkio
lrwxrwxrwx. 1 root root 11 3月 16 18:10 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 3月 16 18:10 cpuacct -> cpu,cpuacct
drwxr-xr-x. 6 root root 0 3月 16 18:10 cpu,cpuacct
drwxr-xr-x. 4 root root 0 3月 16 18:10 cpuset
drwxr-xr-x. 5 root root 0 3月 16 18:10 devices
drwxr-xr-x. 4 root root 0 3月 16 18:10 freezer
drwxr-xr-x. 4 root root 0 3月 16 18:10 hugetlb
drwxr-xr-x. 5 root root 0 3月 16 18:10 memory
lrwxrwxrwx. 1 root root 16 3月 16 18:10 net_cls -> net_cls,net_prio
drwxr-xr-x. 4 root root 0 3月 16 18:10 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 3月 16 18:10 net_prio -> net_cls,net_prio
drwxr-xr-x. 4 root root 0 3月 16 18:10 perf_event
drwxr-xr-x. 5 root root 0 3月 16 18:10 pids
drwxr-xr-x. 5 root root 0 3月 16 18:10 systemd
我们进入cpu目录下,创建一个目录test,查看test中的自动创建的文件:
[root@kubernetes-master01 test]# pwd
/sys/fs/cgroup/cpu/test
[root@kubernetes-master01 test]# ll
总用量 0
-rw-r--r--. 1 root root 0 4月 6 14:41 cgroup.clone_children
--w--w--w-. 1 root root 0 4月 6 14:41 cgroup.event_control
-rw-r--r--. 1 root root 0 4月 6 14:41 cgroup.procs
-r--r--r--. 1 root root 0 4月 6 14:41 cpuacct.stat
-rw-r--r--. 1 root root 0 4月 6 14:41 cpuacct.usage
-r--r--r--. 1 root root 0 4月 6 14:41 cpuacct.usage_percpu
-rw-r--r--. 1 root root 0 4月 6 14:41 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 4月 6 14:41 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 4月 6 14:41 cpu.rt_period_us
-rw-r--r--. 1 root root 0 4月 6 14:41 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 4月 6 14:41 cpu.shares
-r--r--r--. 1 root root 0 4月 6 14:41 cpu.stat
-rw-r--r--. 1 root root 0 4月 6 14:41 notify_on_release
-rw-r--r--. 1 root root 0 4月 6 14:41 tasks
我们查看默认的CPU限制,cpu.cfs_quota_us的值为-1,没有限制:
[root@kubernetes-master01 test]# cat cpu.cfs_period_us
100000
[root@kubernetes-master01 test]# cat cpu.cfs_quota_us
-1
我们可以修改cpu.cfs_quota_us的值为80000,也就是占用80000/100000等于80%的CPU。
对于我们需要限制的进程号,可以填写在tasks文件中:
echo 60068 > tasks
这样就限制了线程60068的CPU最多只能占到80%。
猜你喜欢
如果你对容器化技术的相关知识感兴趣,可以阅读:秀丽的容器化技术Kubernetes专栏
更多推荐
所有评论(0)