我是基于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 监控方案
-
配置Docker daemon提供metrics:
# 编辑/etc/docker/daemon.json { "metrics-addr" : "0.0.0.0:9323", "experimental" : true }然后重启docker服务
-
部署Prometheus和Grafana进行专业监控