根据我目前阅读的教程,使用"docker run -d"将从image启动一个容器,并且容器将在后台运行。这就是它的样子,我们已经有了container id。

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

但如果我运行“docker ps”,什么都没有返回。

所以我尝试了“docker ps -a”,我可以看到容器已经退出:

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

我做错什么了吗?如何解决此问题?


当前回答

这4个命令都可以保持docker容器的运行:

docker run -td centos
docker run -dt centos
docker run -t -d centos
docker run -d -t centos

其他回答

根据这个答案,添加-t标志将防止容器在后台运行时退出。然后使用docker exec -i -t <image> /bin/bash进入shell提示符。

docker run -t -d <image> <command>

-t选项似乎没有很好地记录,尽管帮助说它“分配了一个伪tty”。

背景

Docker容器运行一个进程(“命令”或“入口点”)来保持它的活性。只要命令继续运行,容器就会继续运行。

在您的例子中,命令(默认情况下,centos:latest上的/bin/bash)立即退出(bash在没有连接到终端并且没有什么要运行时也会退出)。

通常,当您以守护进程模式(使用-d)运行容器时,容器正在运行某种守护进程(如httpd)。在这种情况下,只要httpd守护进程在运行,容器就会保持活动状态。

您似乎要做的是在容器内不运行守护进程的情况下保持容器的活性。这有点奇怪(因为容器在与它交互之前没有做任何有用的事情,可能是与docker exec交互),但在某些情况下,这样做可能是有意义的。

(您的意思是在容器内获得bash提示符吗?这很简单!Docker运行- centos:最新)

解决方案

让容器无限期地处于守护模式下活动的一个简单方法是运行sleep infinity作为容器的命令。这并不依赖于做一些奇怪的事情,比如在守护进程模式下分配TTY。尽管它确实依赖于一些奇怪的事情,比如把睡眠作为你的主要命令。

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

可选择的解决方案

正如cjsimon所指出的,-t选项分配一个“伪tty”。这个技巧会继续无限地运行,因为它认为它连接到一个交互式TTY(即使如果不传递-i,您没有办法与那个特定的TTY进行交互)。不管怎样,这个也可以做到:

$ docker run -t -d centos:latest

不能100%确定-t是否会产生其他奇怪的相互作用;如果是的话,请在下方留言。

在前台/分离状态下运行容器有多个选项。但是,如果您仍然觉得问题没有解决,您可以尝试通过查看日志来解决问题。

Sudo docker logs -f >> container.log

此外,您还可以使用——details来显示提供给日志的额外详细信息。

如果里面的任务完成了,Docker容器就会退出,所以如果你想让它存活,即使它没有任何任务或者已经完成了任务,你可以执行Docker run -di image。当你执行docker container ls后,你会看到它正在运行。

你可以简单地使用:

docker container run -d -it <container name or id> /bin/bash