docker容器怎么一直running

阅读:2765 2019-11-02 17:08:36

  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情形的话,这个缺点几乎不能忍。


相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服