一、问题引入
根据镜像启动容器,执行命令如下:docker run --name mycentos -d centos
,通过docker ps
查看正在运行中容器,缺找不到mycentos
容器。再次通过docker ps -a
查看发现,mycentos
容器已经处于停止状态了。
二、原因
- Docker容器后台运行,就必须有一个前台进程.
- 容器运行的命令如果不是那些一直挂起的命令(eg. 运行
top
,tail
等),就是会自动退出 - 这个是
docker
的机制问题,比如我们的web
容器,以nginx
和fpm
为例,
正常情况下,启动服务只需启动相应的service
即可,例如:service nginx start && service php5-fpm start
,但是,这样做,nginx
和fpm
均以后台进程模式运行,就会导致docker
前台没有正在运行的应用,so,容器会立即自杀,因为他觉得没事可做了。
三、解决方案
3.1 将要运行的程序以前台进程的形式运行
将要运行的程序以前台进程的形式运行,如果容器需要同时启动多个进程,那么也只需要将其中一个挂起到前台即可。
比如上面所说的 web
容器,只需要将启动指令修改为:
service php5-fpm start && nginx -g "daemon off;"
3.2 投机方案
对于可能不知道怎么前台运行的程序,提供一个投机方案,只需要在启动的命令之后,添加类似于 tail
top
这种可以前台运行的程序,这里推荐tail
,然后持续输出log
文件即可。
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
再以上面所说的 web
容器为例,可以写成:
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
3.3 以centos/ubuntu
为例
同3.1
,在启动centos/ubuntu
容器时,可以做一个手脚
:做一个死循环
,持续输出任意,这样容器不会认为没事可做而自杀了
。
docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
好了,该问题就简单介绍到这了,如果还没有解决问题或者有更好的解决方案,欢迎留言哈~