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

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐