Docker容器运行正常但API返回空,NodeJS监控面板无法获取容器信息
解决Docker API返回空容器列表的问题
可能的原因及修复步骤
- 核对Docker API版本兼容性
Docker CLI与API的版本必须匹配。先通过以下命令获取当前Docker守护进程的API版本:
docker version --format '{{.Server.APIVersion}}'
将curl命令中的API版本号替换为上述结果,例如若版本为1.44,则执行:
curl --unix-socket /var/run/docker.sock -X GET http://localhost/v1.44/containers/json
版本不匹配会直接导致返回空结果或报错。
- 确认Docker守护进程一致性
若服务器上存在多个Docker守护进程(比如同时安装了Docker Desktop和系统原生Docker),需验证CLI与API连接的是否为同一实例:
先查看CLI连接的守护进程根目录:
docker info --format '{{.DockerRootDir}}'
再通过API查询对应路径:
curl --unix-socket /var/run/docker.sock -X GET http://localhost/v1.xx/info | grep DockerRootDir
若路径不一致,说明API连接的是另一个守护进程,需调整socket路径或切换Docker上下文。
- 检查API请求参数
默认情况下/containers/json仅返回运行中的容器,若仍无结果,可添加参数获取所有容器(含停止状态):
curl --unix-socket /var/run/docker.sock -X GET "http://localhost/v1.xx/containers/json?all=1"
也可通过过滤器精准筛选运行中容器:
curl --unix-socket /var/run/docker.sock -X GET "http://localhost/v1.xx/containers/json?filters={\"status\":[\"running\"]}"
- 修正Docker Socket权限(安全方式)
不建议直接设置sock文件为777,正确做法是将当前用户加入docker组:
sudo usermod -aG docker $USER
执行newgrp docker刷新组权限,之后无需root即可正常调用API。
- 调整Dockerode库配置
使用dockerode时,避免硬写API版本,让库自动协商匹配版本,并确保socket路径正确:
const Docker = require('dockerode'); const docker = new Docker({ socketPath: '/var/run/docker.sock' }); // 先确认API版本再请求容器列表 docker.info((err, info) => { if (err) throw err; docker.listContainers({ all: true }, (err, containers) => { if (err) throw err; console.log('容器列表:', containers); }); });
内容的提问来源于stack exchange,提问作者dartmoordunbar
相关产品推荐
相关产品推荐

