描述
今天在學習docker的時候遇到個問題,在通過鏡像創建容器的過程中,使用命令:docker run --name docker-test -d learn/ping /bin/sh
,運行成功以后,發現容器沒有預期中的后臺運行,而是直接掛掉了,docker ps -a
發現容器已經運行結束了。
原因:
查看命令docker ps -a
的輸出發現容器已經起來了,但是馬上又結束了,查找資料,發現是原因是因為:Docker容器后臺運行,就必須有一個前臺進程。容器運行的命令如果不是那些一直掛起的命令(比如運行top,ping),就是會自動退出的。
而上面的代碼中/bin/bash就是需要執行的指定的命令。
命令如果執行完畢了,或者叫指定的應用終結時,容器會自動停止。
/bin/bash這個命令肯定是一執行就結束了,
-d 表示 此容器以守護狀態運行,啟動后會返回一個容器ID。
我曾經天真的以為這玩意是指啟動后,指定的運行程序就算結束了,此容器也不會結束。
但其實,并不是這樣。。。指定的程序結束了。。。容器也會結束。。。
解決方法:
既然短暫的命令會導致容器運行完就結束,那就試試持續的長時間掛起的命令哈,比如top,ping
之類的,所以把命令改成docker run --name docker-test -d learn/ping ping www.baidu.com
就行了,或者直接啟動掛起的容器,docker start learn/ping
,容器id可以通過docker ps -a
查看,然后執行docker ps
你就會發現容器已經起來了,然后docker attach learn/ping
進入容器的交互式界面,或者docker run -it learn/ping /bin/bash
直接進入交互式界面,退出可以使用ctrl+d或者ctrl+c,或者ctrl+p + ctrl+q。(這種可以退出到宿主機,而保持container仍然在運行,通過docker ps
可以看出)前一種方式退出了,容器也結束了,后一種方式,容器還會在后臺運行。