根据我目前阅读的教程,使用"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 -t -d <image-name>
or
docker run -i -d <image-name>
or
docker run -it -d <image-name>
其他答案所建议的命令参数(即tail -f /dev/null)是完全可选的,并不是让容器保持在后台运行所必需的。
还要注意Docker文档建议组合-i和-t选项会导致它像shell一样运行。
See:
https://docs.docker.com/engine/reference/run/#foreground
嗨,这个问题是因为如果容器中没有正在运行的应用程序,docker容器就会退出。
-d
选项是在守护模式下运行容器。
因此,让你的容器持续运行的技巧是在docker中指向一个shell文件,它将保持你的应用程序运行。您可以尝试使用start.sh文件
Eg: docker run -d centos sh /yourlocation/start.sh
这个start.sh应该指向一个永不结束的应用程序。
如果你不想让任何应用程序运行,你可以安装monit来保持docker容器运行。
请让我们知道这两个案例是否对你的集装箱运行有效。
愿一切都好!
背景
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是否会产生其他奇怪的相互作用;如果是的话,请在下方留言。
也许这只是我的问题,但在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后退出。