容器到底隔离了什么?

一、容器的本质是一个进程

一个容器就如同你之前跑到一个虚拟机中的一个应用程序,比如跑一个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%。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值