资源、日志与运行可观测性¶
Docker 默认不会自动给容器设置 CPU 和内存上限。单个异常容器可能消耗整台主机资源,因此生产运行必须同时设置资源、日志轮转、健康检查和宿主机监控。
CPU 与内存¶
docker run -d --name app \
--cpus 2 \
--memory 1g \
--memory-reservation 768m \
--pids-limit 300 \
registry.example.com/app:1.4.0
| 参数 | 作用 |
|---|---|
--cpus |
限制可使用的 CPU 时间,不固定绑定核心 |
--cpuset-cpus |
绑定指定 CPU,需了解 NUMA/调度影响 |
--memory |
内存硬上限,超过可能触发容器 OOM |
--memory-reservation |
内存压力下的软目标,不代替硬限制 |
--pids-limit |
防止进程/线程数量失控 |
Java 容器还要协调 JVM Heap、Non-Heap、线程栈、Direct Memory 与容器 limit。-Xmx 等于容器内存上限会不给其他内存留空间,容易 OOMKilled。
CPU 达到 --cpus 后通常表现为 throttling 和延迟上升,不一定退出;内存硬上限可能触发 OOM Kill。还要结合宿主机 CPU、内存、磁盘 I/O、网络和 cgroup 指标判断。
日志驱动与轮转¶
容器 stdout/stderr 由 logging driver 处理。默认 json-file 若不限制大小可能写满磁盘。可在 daemon.json 使用 local,或为 json-file 配置轮转:
Daemon 默认日志配置只影响新创建容器,已有容器通常要重建才会采用。不要直接用编辑器截断 Docker 管理的日志文件;先确认驱动和文件路径,再通过正确轮转/重建处理。
docker info --format '{{.LoggingDriver}}'
docker inspect --format '{{.HostConfig.LogConfig.Type}}' app
docker logs --since 30m --timestamps app
远程日志驱动或 Agent 应明确后端不可用时是阻塞、缓冲还是丢弃。应用日志至少带时间、服务、版本、实例和 Trace ID,并避免密码、Token 和完整敏感正文。
健康检查与重启策略¶
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD curl -fsS http://127.0.0.1:8080/health || exit 1
Docker 将容器标记为 unhealthy,但普通 Docker Engine 不会仅因 unhealthy 自动重启容器。重启策略针对进程退出:
健康检查要快速、稳定、低开销。不要把所有非关键下游都绑定进去,否则一个依赖抖动会让所有实例同时 unhealthy。
监控清单¶
- 容器 Running/Restart/Health/Exit Code/OOMKilled。
- CPU 使用与 throttling、内存 working set、PID 数。
- 网络流量、连接错误和发布端口。
- 容器日志速率、驱动错误和宿主机磁盘/inode。
- Docker daemon、containerd、镜像拉取和事件。
- 应用请求率、错误率、延迟、线程池和依赖指标。