版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/u010358168/article/details/81347927
一、問題引入
根據鏡像啓動容器,執行命令如下: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;"
- 1
3.2 投機方案
對於可能不知道怎麼前臺運行的程序,提供一個投機方案,只需要在啓動的命令之後,添加類似於 tail
top
這種可以前臺運行的程序,這裏推薦tail
,然後持續輸出log
文件即可。
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
- 1
再以上面所說的 web
容器爲例,可以寫成:
service nginx start && service php5-fpm start && tail -f /var/log/nginx/error.log
- 1
- 2
3.3 以centos/ubuntu
爲例
同3.1
,在啓動centos/ubuntu
容器時,可以做一個手腳
:做一個死循環
,持續輸出任意,這樣容器不會認爲沒事可做而自殺了
。
docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
- 1
好了,該問題就簡單介紹到這了,如果還沒有解決問題或者有更好的解決方案,歡迎留言哈~