Docker 容器资源管理,你真的学会了吗?


Docker 容器资源管理,你真的学会了吗?

文章插图
作者 | 张晋涛
责编 | 胡巍巍
Docker 上手很容易,但如果将其应用于生产环境,则需要对它有更深入的理解 。只有这样,才能确保应用符合我们的预期,或在遇到问题时可及时解决 。所以,要想真正掌握 Docker 的核心知识,只靠网络上零散的信息往往是不够的,必须系统性地学习 。
容器,作为 Docker 的核心特性之一,是 Docker 使用者们无法回避的重要知识点 。要想了解容器的核心原理,甚至自己动手写容器,不深入了解容器资源管理的相关的内容是绝对不行的 。
本文将以容器资源管理为主题,解决以下三个问题:
哪些分配给容器的资源可被我们管理?容器实际使用了多少资源?如何对容器使用的资源进行管理?
资源类型
对于第一个问题,当我们启动一个容器的时候,它可以使用一些系统资源,这与我们在物理机上启动程序基本是一致的 。比如主要的几类:
CPU内存网络I/OGPU这些系统资源是在我们启动容器时,需要考虑和可被我们管理的 。比如,我们可以执行 docker run --help 查看 docker run 命令所支持的全部参数 。现在 docker run 命令所支持的参数已超过 90 项,这里就不一一列出了 。
查看容器占用资源
docker stats
Docker 提供了一个很方便的命令 docker stats,可供我们查看和统计容器所占用的资源情况 。
我们仍然启动一个 Redis 容器作为示例 。
# 启动一个容器(MoeLove)~ docker run -d redisc98c9831ee73e9b71719b404f5ecf3b408de0b69aec0f781e42d815575d28ada# 查看其所占用资源的情况(MoeLove)~ docker stats --no-stream $(docker ps -ql)CONTAINER IDNAMECPU %MEM USAGE / LIMITMEM %NET I/OBLOCK I/OPIDSc98c9831ee73amazing_torvalds0.08%2.613MiB / 15.56GiB0.02%3.66kB /0B0B / 0B4
这里传递了一个 --no-stream 的参数,是因为 docker stats 命令默认是一个持续的动态流式输出(每秒一次),给它传递 --no-stream 参数后,它就只输出一次便会退出了 。
接下来我为你介绍下它输出内容的含义:
Container ID:容器的 ID,也是一个容器生命周期内不会变更的信息 。Name:容器的名称,如果没有手动使用 --name 参数指定,则 Docker 会随机生成一个,运行过程中也可以通过命令修改 。CPU %:容器正在使用的 CPU 资源的百分比,这里面涉及了比较多细节,下面会详细说 。Mem Usage/Limit:当前内存的使用及容器可用的最大内存,这里我使用了一台 16G 的电脑进行测试 。Mem %:容器正在使用的内存资源的百分比 。Net I/O:容器通过其网络接口发送和接受到的数据量 。Block I/O:容器通过块设备读取和写入的数据量 。Pids:容器创建的进程或线程数 。docker top
除了上面提到的 docker stats 命令外,Docker 也提供了另一个比较简单的命令 docker top,与我们平时用的 ps 命令基本一致, 也支持 ps 命令的参数 。
(MoeLove)~ docker top $(docker ps -ql)UIDPIDPPIDCSTIMETTYTIMECMDsystemd+62756248016:50?00:00:24redis-server *:6379# 可以使用 ps 命令的参数(MoeLove)~ docker top $(docker ps -ql)-o pid,stat,cmdPIDSTATCMD6275Sslredis-server *:6379
管理容器的 CPU 资源
在我们使用容器的时候,CPU 和内存是我们尤为关注的资源 。不过,对于 CPU 资源的管理,涉及的内容会比较偏底层一些,有些涉及到了内核的 CPU 调度器,比如 CFS(Completely Fair Scheduler)等 。
我们可以先来查看下 Docker 提供了哪些控制 CPU 资源相关的参数 。使用 docker run --help |grep CPU 即可查看 。
(MoeLove)~ docker run --help |grep CPU--cpu-period intLimit CPU CFS (Completely Fair Scheduler) period--cpu-quota intLimit CPU CFS (Completely Fair Scheduler) quota--cpu-rt-period intLimit CPU real-time period in microseconds--cpu-rt-runtime intLimit CPU real-time runtime in microseconds-c, --cpu-shares intCPU shares (relative weight)--cpus decimalNumber of CPUs--cpuset-cpus stringCPUs in which to allow execution (0-3, 0,1)
这里暂时先不对参数的具体含义进行深入展开,我们直接以几个示例来分别进行说明,帮助大家理解 。
默认无限制
备注:我这里以一个 4 核 CPU 的电脑进行演示 。
现在我们启动一个容器,我们以体积很小的 Alpine Linux 为例好了 。
(MoeLove)~ docker run --rm -it alpine / #
在另一个窗口,执行上面介绍的查看容器资源的命令:
(MoeLove)~ docker stats --no-stream $(docker ps -ql)CONTAINER IDNAMECPU %MEM USAGE / LIMITMEM %NET I/OBLOCK I/OPIDS106a24399bc9friendly_varahamihira0.00%1.047MiB / 15.56GiB0.01%5.01kB /0B1.67MB / 0B1
可以看到,当前容器内没有过多的 CPU 消耗,且 PIDS 为 1,表示当前只有一个进程 。


推荐阅读