我是基于ChatGPT-turbo-3.5实现的AI助手,在此网站上负责整理和概括文章

本文介绍了Docker容器的资源控制方法,涵盖CPU和内存的限制设置,如CPU份额、核心绑定,以及内存限制和交换空间管理。文章提供了命令示例和综合配置,并详细说明了资源监控工具,如docker stats和cAdvisor,突出这些技术在优化容器性能和确保系统稳定方面的实用价值。

# CPU 资源控制

# CPU 份额限制 (相对权重)

docker run -it --cpu-shares=512 image_name
  • 默认值为1024
  • 只在CPU资源紧张时生效
  • 示例:
    • 容器A (--cpu-shares=1024)
    • 容器B (--cpu-shares=512)
    • 当CPU繁忙时,A获得2/3的CPU时间,B获得1/3

# CPU核心数量限制 (绝对限制)

docker run -it --cpus="1.5" image_name
  • 限制容器最多使用1.5个CPU核心的计算能力
  • 可以是小数,如0.5表示半个核心

# CPU核心绑定

docker run -it --cpuset-cpus="0-2" image_name
  • 限制容器只能运行在指定的CPU核心上
  • "0-2"表示核心0、1、2
  • "0,2"表示核心0和2

# 内存资源控制

# 内存限制

docker run -it --memory="2g" image_name
  • 限制容器最多使用2GB内存

# 内存+交换空间限制

docker run -it --memory="2g" --memory-swap="3g" image_name
  • 容器可以使用2GB内存和1GB交换空间(swap=3g-2g)

# 内存软限制

docker run -it --memory-reservation="1g" image_name
  • 当系统检测到内存争用时,尝试保证容器至少有1GB内存

# 综合示例

这个命令启动了一个名为 my_container 的容器,限制它最多使用 2GB 内存(可额外使用 1GB 交换空间)、2 个 CPU 核心的计算能力,并绑定到 CPU 0-3 核心上运行,同时设置了默认的 CPU 优先级(权重 1024)和 1GB 的内存软限制。

docker run -d \
  --name my_container \
  --memory="2g" \ # 设置容器可用的​​最大物理内存​​为 2GB
  --memory-swap="3g" \ # 交换空间可用1GB
  --memory-reservation="1g" \ # 当宿主机内存不足时,Docker 会尝试将容器内存使用限制到此值
  --cpus="2" \ # 最多可以使用​​2个CPU核心​​
  --cpu-shares=1024 \ # 只在CPU资源紧张时起作用,获取CPU时间的优先级
  --cpuset-cpus="0-3" \ # 能运行在​​CPU核心0到3​​上(即第1到第4个核心)
  my_image

# 资源使用监控

要监控 Docker 容器设置的 CPU 和内存限制的具体使用情况,可以使用以下几种方法:

# docker stats 命令(实时监控)

docker stats [容器名或ID]

示例输出:

CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O   PIDS
a1b2c3d4e5f6   my_container  75.12%    1.2GiB / 2GiB         60.00%    1.3MB/5.2MB   0B/0B       15

特点

  • 实时显示所有运行中容器的资源使用情况
  • 显示CPU百分比、内存使用量/限制量、内存百分比等
  • 按Ctrl+C退出监控

# docker stats 输出到文件

docker stats --no-stream --format "table <!--swig0-->\t<!--swig1-->\t<!--swig2-->" > stats.log

参数说明

  • --no-stream:只输出一次而不是持续监控
  • --format:自定义输出格式
  • 可以添加到cron定时任务中定期记录

# docker inspect 查看配置

docker inspect --format='<!--swig3-->' 容器名或ID  # 查看CPU份额
docker inspect --format='<!--swig4-->' 容器名或ID    # 查看内存限制
docker inspect --format='<!--swig5-->' 容器名或ID  # 查看CPU核心限制(纳秒级)

# 容器内部命令查看

docker exec -it 容器名或ID top
docker exec -it 容器名或ID htop    # 需要容器内安装htop
docker exec -it 容器名或ID free -h # 查看内存
docker exec -it 容器名或ID cat /proc/cpuinfo # 查看CPU信息

# 使用

cAdvisor是Google的容器监控工具

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

访问 http://localhost:8080 查看图形化监控界面

# Prometheus + Grafana 监控方案

  1. 配置Docker daemon提供metrics:

    # 编辑/etc/docker/daemon.json
    {
      "metrics-addr" : "0.0.0.0:9323",
      "experimental" : true
    }

    然后重启docker服务

  2. 部署Prometheus和Grafana进行专业监控

更新于

请我喝[茶]~( ̄▽ ̄)~*

Fulsun 微信支付

微信支付

Fulsun 支付宝

支付宝