Docker ps显示空列表

90
我从docker文件中构建了一个docker镜像。 Build命令提示构建成功。但是,当我尝试通过docker ps(也尝试过docker ps -a)来显示docker容器时,它显示一个空列表。奇怪的是,我仍然能够通过调用docker push "容器名称"将我的docker镜像推送到dockerhub。
我想知道发生了什么?我在Windows 7上,并刚安装了最新版本的dockertoolbox。

1
同样的问题Ubuntu22 Docker无法显示nvidia-docker容器。 - Andrei Belousov
9个回答

145

docker ps 展示正在运行的容器。 docker images 则展示镜像。

成功构建的 docker 镜像应该会出现在 docker images 生成的列表中,但只有正在运行的容器(是镜像的一个实例)才会出现在 docker ps 列表中(使用 docker ps -a 还可以看到停止的容器)。要从您的镜像启动容器,请使用 docker run


47
只是想让这个答案更完整,针对那些 Docker 初学者,命令 docker ps -a 将列出所有容器,包括“Exited”和“Dead”容器。 - mainframer
4
@mainframer 这非常有帮助。我第一次进行Docker故障排除,我的容器一直无法运行。如果没有-a标志,我就看不到它。 - Ethan Hohensee
2
这是docker非常糟糕的设计,需要添加-a。对于超级新手非常不友好。我有大约15个容器,根本找不到。 - WestCoastProjects
在我的电脑上,docker ps -al 只返回一个容器,但是 docker ps -a -f status=exited 返回了我所有的容器。 - Adrien Pacifico
@AdrienPacifico,你使用的-l标志指示docker仅显示最新创建的容器。如果省略-l(即docker ps -a),则应获取所有容器。-f status=exited按状态过滤并排除例如处于“已创建”或“死亡”状态的容器。 - Sven Koschnicke
糟糕,我假设 l 代表“列表”(如 ls)而不是“最新”的意思。@SvenKoschnicke,非常感谢您让我认识到这一点! - Adrien Pacifico

38

我遇到一个问题,使用命令 docker ps -adocker images 都返回了空列表,但实际上我有很多正在运行的Docker容器。我尝试重启系统,但没有任何效果。使用命令 sudo systemctl restart docker 快速解决了这个“bug”。


3
如果你知道列表应该不为空,但却是空的话,这就是正确的答案。 - Ken Syme
2
这对我解决了问题。每个Docker命令和Portainer界面都没有显示任何容器、网络或者其他东西,除了堆栈之外,但是Portainer本身正在运行,所以我知道它们正在执行。很奇怪... - Chris Rice
每次我重新启动我的Ubuntu系统时,都会出现这个问题。运行“sudo systemctl restart docker”总是可以解决它。但是在下一次重新启动后,它又会变得不好。请注意,我应该看到的Docker容器确实正在运行,只是“docker ps -a”没有列出它们。这是Docker的bug吗? - ruralcoder
不幸的是,这似乎会停止所有正在运行的容器。有没有一种“无缝”重启Docker的方法? - D M
单独执行restart docker对我来说没有起作用,尽管它尝试重新启动我的不可见但正在运行的容器,但当然无法绑定到端口。(如果有关系的话,我使用的是Ubuntu Server 22.04LTS)。我认为只需要在重新启动后执行sudo systemctl restart docker.socket,然后在主机上只会出现一个小故障,就可以再次显示完整的列表了(不确定是否由于socket重新启动而实际重新启动)。 - undefined

10

尝试重新启动

sudo systemctl restart docker.socket
sudo systemctl restart docker

1
这对我有用,我还需要重启docker.socket。谢谢。 - jonface

3

您可以不使用-d选项运行命令,这样输出将会被显示。

可能是应用程序启动失败了。


2

对我来说,唯一解决问题的方法就是重新安装Docker。此外,必须确保磁盘不满。

这是我使用的命令,但它可能会因已安装的Docker版本而有所不同:

apt-get install --reinstall docker.io

如果提示,选择“是”以自动重启Docker守护进程。

2

针对Linux系统,

首先需要查看所有正在运行的容器。

sudo docker ps

尝试重新启动

sudo systemctl restart docker

如果有同名的先前docker镜像,请删除它。

sudo docker rm docker_container_id

再次运行

sudo docker run -d --name container_name image_name

这应该可以工作

或者卸载Docker并重新安装


0
在 Dockerfile 指令中,请确保 CMD 命令在双引号而不是单引号之间。
例如: CMD [ "node" , 'index.js'] 这里有一个错误!!
正确的写法是: CMD [ "node" , "index.js"] 这个错误会导致容器立即运行并退出。

0
在我的情况下,我在Docker Desktop上安装了"Dive-in"扩展,我想它应该有自己的镜像,并且容器正在某个地方运行。当尝试删除该镜像时,它会抱怨容器仍在运行,然而,容器列表却是空的。
由于我不再使用它,我卸载了该扩展,然后镜像就消失了。

0
好的,我想我已经找到了一个更好的根本原因,导致了`docker ps`显示一个空列表,但是容器已知在运行,至少在Ubuntu Server 22.04上,也许Docker是在初始安装时安装的(通过Snap?),然后再通过标准指令(通过apt)安装。
答案来自这里:https://forums.docker.com/t/ubuntu-22-04-unexpected-docker-socket-behaviour-after-boot/134626/3 要点是Docker是从两个来源安装的:apt + snap,其中一个在启动时启动,另一个替换它(但不知道正在运行的容器)。
通过运行以下命令来检查是否是这种情况:
dpkg -l | grep docker
snap list | grep docker

如果两者都显示docker,那可能就是问题所在。
使用以下命令删除snap安装:
sudo snap remove docker

一旦我完成了上述操作,我就收到了以下输出结果:
$> docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

但是后来我做了:
$> sudo systemctl restart docker.socket
$> docker ps
CONTAINER ID   IMAGE     ...
ffe52...       container ...

看到了我的容器。
此外,在重新启动后,简单地运行docker ps会显示预期的容器,而不是空列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接