基于本文回答
0
评论

如何在不停止运行中容器的情况下,动态调整或更新其 CPU 和内存的限制?

在 Docker 中,你完全可以在不停止运行中容器的情况下,动态调整其 CPU 和内存的限制。

Docker 提供了一个非常强大的命令:docker update。它利用了 Linux 内核的 cgroups(控制组)机制,允许在运行时动态修改容器的资源限制。

以下是具体的实现方法和注意事项:


1. 核心命令:docker update

基本语法如下:

bash
docker update [OPTIONS] CONTAINER [CONTAINER...]

常见参数:

  • 内存限制:
    • -m, --memory:限制容器使用的最大内存(例如 500m, 2g)。
    • --memory-swap:限制 内存 + Swap 的总大小(设置为 -1 表示不限制 Swap)。
  • CPU 限制:
    • --cpus:限制容器可以使用多少个 CPU 核心(例如 1.5 表示可以使用 1.5 个 CPU 核心,支持小数)。
    • -c, --cpu-shares:CPU 权重(相对值,默认 1024)。
    • --cpu-period / --cpu-quota:更底层的 CPU 时间片限制。

2. 实用示例

假设你的容器名称或 ID 是 my_web_app

示例 A:动态调整内存

将容器的内存限制调整为 2 GB

bash
docker update --memory 2g --memory-swap 2g my_web_app

重要提示: 在调整内存时,通常建议同时设置 --memory-swap。如果不设置,或者设置得比 --memory 小,可能会报错。

示例 B:动态调整 CPU 限制

限制容器最多使用 2 个 CPU 核心

bash
docker update --cpus 2 my_web_app

示例 C:同时调整 CPU 和内存

将内存限制为 1 GB,CPU 限制为 1.5 核

bash
docker update --memory 1g --memory-swap 1g --cpus 1.5 my_web_app

3. 验证调整是否生效

你可以使用以下两种方法验证资源限制是否已动态更新:

方法一:使用 docker stats(实时查看)

bash
docker stats my_web_app

在输出的界面中,你可以实时看到 LIMIT(内存限制)一列已经变为了你刚刚设置的值。

方法二:使用 docker inspect(查看配置)

bash
docker inspect my_web_app | grep -iE "memory|nano"

或者直接过滤具体的 JSON 字段:

bash
# 查看内存限制(单位:字节)
docker inspect -f "{{.HostConfig.Memory}}" my_web_app

# 查看 CPU 限制(NanoCPUs,1.5核会显示为 1500000000)
docker inspect -f "{{.HostConfig.NanoCpus}}" my_web_app

4. 关键注意事项与避坑指南

  1. 内存调小(Shrinking)的风险(OOM):

    • 如果你将运行中容器的内存限制调得太小,低于容器当前实际使用的内存,容器内的进程可能会立即触发 OOM (Out Of Memory) killer,导致容器内的服务崩溃或容器直接退出。
    • 建议: 调小内存前,先用 docker stats 查看当前实际占用的内存(MEM USAGE)。
  2. 内核支持与 Swap 限制:

    • 在某些 Linux 发行版(如 Ubuntu/Debian)上,可能会遇到类似警告:WARNING: Your kernel does not support swap limit capabilities...
    • 如果遇到此问题,需要修改系统的 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加 cgroup_enable=memory swapaccount=1,然后更新 grub 并重启宿主机。
  3. Docker Compose 项目:

    • 使用 docker update 只是临时修改了运行中的容器。如果以后你使用 docker-compose down 然后 docker-compose up -d 重建了容器,这些限制将会失效。
    • 最佳实践: 动态调整确认无误后,记得同步修改你的 docker-compose.ymlk8s 配置文件,以便持久化这些设置。
右滑查看面试常问