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

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


当前回答

论证顺序很重要

Jersey Beans的答案(所有3个例子)对我很有用。经过相当多的尝试和错误之后,我意识到论点的顺序很重要。

保持容器在后台运行: Docker运行-t -d <image-name>

保持容器在前台运行:docker run <image-name> -t -d

对于我这种拥有Powershell背景的人来说,这一点并不明显。

其他回答

也许这只是我的问题,但在CentOS 7.3.1611和Docker 1.12.6上,我最终不得不使用@VonC和@Christopher Simon发布的答案的组合来可靠地工作。在此之前我所做的任何事情都不会阻止容器在成功运行CMD后退出。我正在启动oracle-xe-11Gr2和sshd。

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

然后添加-d -t和-i运行

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

在我用头撞墙几个小时后终于

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

不管出于什么原因,如果末尾的-f被删除,或者省略了任何-t -d -i选项,上述命令将在执行CMD后退出。

如果要对容器进行操作,则需要在前台运行它以保持它的活动状态。

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

Sudo docker logs -f >> container.log

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

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

创建容器:

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

Docker需要你的命令保持在前台运行。否则,它会认为应用程序停止并关闭容器。

因此,如果你的docker输入脚本是一个后台进程,如下所示:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

如果以后没有触发其他前台进程,'&'将使容器停止并退出。 因此,解决方案是删除'&'或在它后面运行另一个前台CMD,例如

tail -f server.log