docker学习笔记(八):资源限制、监控与编排

211人浏览 / 0人评论

这次的内容有点多,涉及到了容器的资源限制、容器运行状况监控和容器编排。

同时也是本阶段学习Docker的尾声,接下来将继续学习kubernetes相关知识,相关学习笔记也会同步更新上来。

容器资源限制

Docker在默认情况下可以使用物理机所有资源,很多时候不做限制将会导致容器无休止的占用物理机资源。比如一些运算密集型的容器,持续占用CPU资源;再比如Redis等内存数据库容器将占用更多的内存资源。这样由于个别容器的设计不合理等问题,很有可能导致整个物理机中的容器都无法正常运行。

Docker实现容器资源限制的方式主要是依靠系统内核中的**Cgroups**,cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。这也是最早的容器,当时叫做进程容器,其实现在Docker也就可以理解成就是一个进程。

对内存进行限制

对内存进行限制,主要是在创建容器是进行指定,具体方如下:

docker run -it -m 200M --rm centos:v1 /bin/bash

以上命令就将容器的最大可使用内存设置为200M了,当容器内部应用使用内存超过200M时将会因为OOM被强行关闭。

对CPU进行限制

谈及CPU限制,主要是使用CPU的亲和性来进行指定容器运行的CPU。相关指令:

docker run -it --cpuset-cpus=1 --rm centos:v1 /bin/bash

这条指令将会绑定该容器到cpu1上,容器中的所运行的程序都将在这颗CPU上执行。

CPU的亲和性

CPU Affinity 可以将进程或线程绑定到一个CPU核或一组CPU核上,这样进程或线程只能在指定的CPU核上执行。可以看做是对操作系统中的调度算法的进行了修改。

意义:线程在一个CPU上运行后,CPU的缓存中可能保存了一些信息,调度该线程在同一CPU上执行减少了缓存未命中,提高了性能,例如用于进行图形渲染的程序

参见:Java CPU亲和性

下面列举一些指令:

# 查看系统CPU信息
[root@localhost ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
......

# 创建4个死循环
[root@localhost ~]# cat /dev/zero > /dev/null &
[1] 39829
[root@localhost ~]# cat /dev/zero > /dev/null &
[2] 39830
[root@localhost ~]# cat /dev/zero > /dev/null &
[3] 39831
[root@localhost ~]# cat /dev/zero > /dev/null &
[4] 39832

# 查看4个程序所在CPU信息, 其中psr就是所在CPU编号,当前系统环境只有一个CPU,所以都是0
[root@localhost ~]# ps mo pid,comm,psr `pgrep cat`
   PID COMMAND         PSR
 39829 cat               -
     - -                 0
 39830 cat               -
     - -                 0
 39831 cat               -
     - -                 0
 39832 cat               -
     - -                 0

# 安装 killall
[root@localhost ~]# yum whatprovides */killall
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
......

# 关闭所有cat进程
[root@localhost ~]#  killall -9 cat

# 指定cat 进行使用cpu
taskset -c 0 cat /dev/zero > /dev/null &

更多资源限制参看:使用 docker 对容器资源进行限制

容器监控

这里主要使用到了google提供的cadvisor工具。

docker pull hub.c.163.com/xbingo/cadvisor:latest

docker run \
> -v /var/run:/var/run \
> -v /sys:/sys:ro \
> -v /var/lib/docker:/var/lib/docker:ro \
> -d -p 8080:8080 --name=mon \
> hub.c.163.com/xbingo/cadvisor;latest

容器编排

这里主要讲的是docker-compose这个工具。 相关命令:

# 安装和卸载docker-compose
[root@localhost ~]#  yum install python2-pip -y
[root@localhost ~]#  pip install docker-compose
[root@localhost ~]#  pip uninstall docker-compose
[root@localhost ~]#  docker-compose -v

# docker-compose相关命令
[root@localhost ~]#  docker-compose start
[root@localhost ~]#  docker-compose stop
[root@localhost ~]#  docker-compose rm
[root@localhost ~]#  docker-compose start -d

更多内容可以参看:【Docker入门】第三部分 服务

还有一些其他的编排工具:

  • swarm
  • mesos
  • openshift
  • kubernets

后面将持续更新kubernets的相关学习笔记。

全部评论