如何在不停止运行中容器的情况下,动态调整或更新其 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. 关键注意事项与避坑指南
内存调小(Shrinking)的风险(OOM):
- 如果你将运行中容器的内存限制调得太小,低于容器当前实际使用的内存,容器内的进程可能会立即触发 OOM (Out Of Memory) killer,导致容器内的服务崩溃或容器直接退出。
- 建议: 调小内存前,先用
docker stats查看当前实际占用的内存(MEM USAGE)。
内核支持与 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 并重启宿主机。
- 在某些 Linux 发行版(如 Ubuntu/Debian)上,可能会遇到类似警告:
Docker Compose 项目:
- 使用
docker update只是临时修改了运行中的容器。如果以后你使用docker-compose down然后docker-compose up -d重建了容器,这些限制将会失效。 - 最佳实践: 动态调整确认无误后,记得同步修改你的
docker-compose.yml或k8s配置文件,以便持久化这些设置。
- 使用