轉(zhuǎn)載注明出處[ http://www.itdecent.cn/p/b165537fa6cc ]
序
首先說明:鏡像不是虛擬機,Docker只是運行在宿主機上的一個進程!這就是與虛擬機的最大區(qū)別。
舉例解釋
一個很簡單的例子來闡述二者區(qū)別,這個例子也是初學(xué)者常犯的錯誤。
例如寫好了一個Dokcerfile,CMD命令中想在啟動容器的同時啟動一個nginx服務(wù)器。大多數(shù)初學(xué)者就這樣寫:
CMD service nginx start
但是會發(fā)現(xiàn),啟動一個容器后立即就退出了。
出現(xiàn)這種情況的原因是沒有搞清楚鏡像內(nèi)是不存在后臺進程這一概念~!
在虛擬機中,服務(wù)既可以運行在前臺,也可掛在后臺運行,但是對于容器而言,其本身只是個進程,因此所有要運行的服務(wù)都得運行在前臺!對于容器而言,其啟動程序就是容器應(yīng)用進程,容器就是為了主進程而存在的,主進程退出,容器就失去了存在的意義,從而退出,其它輔助進程不是它需要關(guān)心的東西。
而使用 service nginx start 命令,則是希望 upstart 來以后臺守護進程形式啟動 nginx 服務(wù)。但是對于CMD命令而言,這樣的 CMD service nginx start命令 會被理解為 CMD [ "sh", "-c", "service nginx start"],因此主進程實際上是 sh。那么當(dāng) service nginx start命令結(jié)束后,sh也就結(jié)束了,sh 作為主進程退出了,自然就會令容器退出。
正確的做法是直接執(zhí)行 nginx 可執(zhí)行文件,并且要求以前臺形式運行。比如:
CMD ["nginx", "-g", "daemon off;"]