使用Docker Stack Deploy部署容器后,Docker Inspect显示Memory与NanoCpus值为0的问题
这是个常见的误解——你用docker inspect查看容器时看到的Memory和NanoCpus字段,对应的是直接通过docker run命令启动容器时设置的容器级资源限制/预留,而Swarm模式下的资源配置是在服务级别生效的,不会直接映射到容器的这些字段里,所以显示0是正常现象,但这不代表你的资源预留没生效。
下面是验证和确认的具体步骤:
1. 确认服务级资源配置已正确应用
执行以下命令查看你的服务配置:
docker service inspect <your_service_name>
在输出的JSON结构中,找到Spec.TaskTemplate.Resources.Reservations节点,你应该能看到和配置文件中一致的Cpus和Memory值。如果这里能看到正确的数值,说明你的资源预留已经被Swarm正确识别,并且在调度容器时会优先选择满足资源条件的节点。
2. 查看容器实际资源使用情况
如果想确认容器的资源使用是否符合预期,使用docker stats命令更直观:
docker stats <container_name>
这个命令会实时展示容器的CPU使用率、内存占用量,以及节点分配给它的资源情况,能直接看到资源预留是否在实际运行中起作用。
3. 若需要容器层面的强制限制(可选)
如果你的场景需要在容器层面强制限制资源使用(比如避免容器占用过多节点资源),可以在配置里添加limits字段,与reservations同级:
deploy: mode: replicated replicas: 1 resources: reservations: cpus: '0.25' memory: 512M limits: cpus: '0.5' # 限制容器最多使用0.5核CPU memory: 1G # 限制容器最多使用1GB内存 restart_policy: condition: on-failure max_attempts: 3
添加后再用docker inspect查看容器,就能看到Memory和NanoCpus字段对应到limits的数值了。这里要注意:reservations是调度时的「预留保障」,确保节点有足够资源才会调度容器;而limits是运行时的「上限限制」,两者作用不同。
总结一下:只要docker service inspect里能看到正确的预留配置,你的资源设置就已经生效了,docker inspect显示0只是因为它不展示Swarm服务级的配置,完全不用担心~
内容的提问来源于stack exchange,提问作者philein-sophos

