{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
docker容器怎么一直running?很多人第一次接触docker,都会有个错觉,认为运行一个container就和运行一个虚拟机一样,dockerrun之后,该container即一直处于running状态。其实,这种认识是完全错误的。
container刚起来的时候,用户可以通过dockerfile中的CMD,ENTRYPOINT,或者直接在dockerrun后面接comand,来指定container启动时执行的程序。
如果指定的程序只是一个短暂的任务,比如echosorry。那么,sorry,container在输出“sorry”之后,就退出了。可以通过dockerinspect看到,container状态变成了Exited。一旦进入Exited状态,以下命令将不再work:
dockerexec<container>
dockerattach<container>
这两个命令都需要<container>处于running!
官方文档里有明确指出,dockerstart<container>可以重新启动<container>,那它又可以转成running状态。
但是,刚刚start的container在启动之后,会再一次执行CMD的命令。然后,它又很快完成任务,进入Exited状态休息了。
如果启动一个container之后,想把它当做一个虚拟机使用(也就说,使用dockerexec在container内部环境中运行程序),那么一定要保证这个container一直处于running的状态。
有两种情况需要考虑:
1、container在启动的时候,CMD没有指定一些service任务
2、CMD中指定了一些重要的service,比如web服务
对于第二种情况,container中一直运行着web服务器,作为一个service,除非你主动stop它,这个service会一直跑着。于是,起来的container也会一直running,于是执行dockerexec没有任何问题。
对于第一种情况,很明显container不久之后就会Exited。让它一直处于running的方法至少有两种:
既然CMD没有指定啥service,那么可以假设CMD指定的任务不重要,如果真的很重要,可以在制作dockerfile的时候通过RUN指定。所以,我们可以修改CMD,比如
dockerrun<image>tail-f/dev/null
其中tail-f/dev/null这个程序会一直block住,没有外界signal的情况下,不会退出,于是container就一直running
上面这种方法,毕竟有可能会覆盖dockerfile中的CMD,一个更好的方法是——dockercommit.
dockerrun<image>
dockercommit`dockerps-ql`<new_image>
dockerstop`dockerps-ql`
dockerrm`dockerps-ql`
dockerrun<new_image>tail-f/dev/null
其中,dockerps-ql用于获得最近创建的container的id。这个方法的缺点在于,多创建了一个image,占用空间。考虑CI/CD情形的话,这个缺点几乎不能忍。