在线调整容器限额
docker update 修改已运行容器的资源限制与重启策略,不需要重建容器:内存上限、CPU 配额、进程数限制和重启策略都可以热调,改动写入容器配置后由内核 cgroup 生效。端口映射、挂载、网络与环境变量这类在创建时确定的内容不支持热改,只能重建容器或改用可动态调整的配置注入方式。
基本信息
| 语法 | docker update [--memory 512m] [--cpus 1] 容器名 |
|---|---|
| 可热改 | 内存与 swap 上限、CPU 配额与权重、Pids 限制、重启策略 |
| 不可热改 | 端口映射、卷挂载、网络归属、环境变量、镜像本身 |
| 生效方式 | 写入 HostConfig,由 cgroup 生效,容器进程不需要重启 |
| 验证 | docker inspect -f '{{.HostConfig.Memory}}' 容器名 |
| 边界 | Swarm 服务需用 docker service update,改容器不会改服务定义 |
典型使用场景
- 应急止血:应用内存泄漏时先收紧内存上限,防止拖垮宿主机上其他服务
- 把长期无限制的容器补上上限,避免单个容器吃满 CPU 或内存
- 临时提高批量任务的 CPU 配额,跑完再调回原值
- 调整重启策略:把 always 改成 unless-stopped,避免手工停止后被自动拉起
- 给入口脚本可能无限 fork 的容器加 Pids 限制,防 fork 炸弹
常用命令
常用命令
docker update --memory 1g --memory-swap 1g --cpus 2 myapp # 设内存与 CPU 上限
docker update --memory 512m --memory-swap 512m myapp # 收紧内存并同时限制 swap
docker update --pids-limit 200 myapp # 限制进程与线程总数
docker update --restart unless-stopped myapp # 改重启策略
docker inspect -f '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}' myapp # 验证
docker stats --no-stream myapp # 对比实际用量与限制inspect 字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| HostConfig.Memory | 内存上限(字节) | 为 0 表示无限制,容器可逐步吃满宿主内存 |
| HostConfig.MemorySwap | 内存加 swap 的总上限 | 取值小于 Memory 时 docker 会直接拒绝参数 |
| HostConfig.NanoCpus | CPU 配额,单位为纳核 | --cpus 2 对应 2000000000,为 0 表示不限 |
| HostConfig.PidsLimit | 进程数上限 | 0 或 -1 表示不限制,fork 风暴时无法兜底 |
| HostConfig.RestartPolicy | 重启策略 | 与预期不符通常是改错了对象(容器还是服务) |
热改限额适合应急止血:内存泄漏先限内存,CPU 抢占先限配额,把影响面控制住;根因仍要通过发版、修复或扩容解决,长期靠限制运行会让业务在高峰期更容易失败。
内存上限调小不会立即杀死容器,只有在内存压力触到上限时才触发 OOMKilled(退出码 137)。排查时看 docker inspect 的 State.OOMKilled 与内核日志,而不是只看应用日志。