根据我目前阅读的教程,使用"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

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


当前回答

我也遇到了同样的问题,只是打开另一个终端,对我来说很管用:

创建容器:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

启动容器:

docker start 52bbc9b30557

启动bash以保持容器运行:

docker exec -it 52bbc9b30557 bash

启动流程您需要:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

其他回答

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

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

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

我也面临着同样的问题,但方式不同。当我创建docker容器时。它会自动停止正在后台运行的未使用的容器。有时它还会停止正在使用的容器。 在我的情况下,这是因为docker的许可。Sock文件,它早先有。 你要做的是:-

Install docker again.(As i work on ubuntu i install it from here) Run the command to change the permissions. sudo chmod 666 /var/run/docker.sock Install docker-compose (this is optional as I have compose file to create many containers together) sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose check for the version to ensure that I have the latest one and not get problem with some deprications. Then I run the docker container build.

我也遇到了同样的问题,只是打开另一个终端,对我来说很管用:

创建容器:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

启动容器:

docker start 52bbc9b30557

启动bash以保持容器运行:

docker exec -it 52bbc9b30557 bash

启动流程您需要:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

centos dockerfile有一个默认命令bash。

这意味着,当在后台(-d)运行时,shell将立即退出。

更新2017

最新版本的docker授权以分离模式和前台模式运行容器(-t, -i或-it)

在这种情况下,你不需要任何额外的命令,这就足够了:

docker run -t -d centos

bash将在后台等待。 这最初是在kalyani-chaudhari的回答中报道的,并在jersey bean的回答中详细描述。

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

注意,对于alpine, Marinos An在评论中报告:

Docker运行-t -d alpine/git不会保持进程正常运行。 必须这样做:docker run——entrypoint "/bin/sh" - alpine/git


原答案(2015)

如本文所述:

不要使用docker run -i -t image your-command来运行,建议使用-d,因为你可以只用一个命令来运行容器,而且不需要通过按Ctrl + P + Q来分离容器的终端。

但是,-d选项有一个问题。您的容器立即停止,除非命令一直在前台运行。 Docker需要你的命令保持在前台运行。否则,它会认为应用程序停止并关闭容器。

问题是一些应用程序不能在前台运行。我们怎样才能让它变得更简单呢?

在这种情况下,您可以在命令中添加tail -f /dev/null。 通过这样做,即使你的主命令在后台运行,你的容器也不会停止,因为tail在前台继续运行。

所以这是可行的:

docker run -d centos tail -f /dev/null

或者在Dockerfile中:

ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]

docker ps将显示centos容器仍在运行。

从那里,你可以附加到它或从它分离(或docker执行一些命令)。

在交互模式下运行docker可能会解决这个问题。

下面是使用和不使用交互模式运行映像的示例

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker运行-d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

容器id镜像命令创建状态端口名称

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

容器id镜像命令创建状态端口名称 “bash”2 seconds ago Up 1秒