?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
容器的主要運(yùn)行過(guò)程是ENTRYPOINT
和/或CMD
在Dockerfile
.一般建議您使用每個(gè)容器一個(gè)服務(wù)來(lái)區(qū)分關(guān)注的區(qū)域。該服務(wù)可能分到多個(gè)進(jìn)程%28,例如,Apacheweb服務(wù)器啟動(dòng)多個(gè)工作進(jìn)程%29。有多個(gè)進(jìn)程是可以的,但是為了從Docker中獲得最大的好處,請(qǐng)避免一個(gè)容器負(fù)責(zé)整個(gè)應(yīng)用程序的多個(gè)方面。您可以使用用戶定義的網(wǎng)絡(luò)和共享卷連接多個(gè)容器。
容器的主進(jìn)程負(fù)責(zé)管理它啟動(dòng)的所有進(jìn)程。在某些情況下,主進(jìn)程設(shè)計(jì)不好,并且在容器存在時(shí)沒(méi)有很好地處理“收割”%28停止%29子進(jìn)程。如果您的流程屬于此類別,則可以使用--init
選項(xiàng)在運(yùn)行容器時(shí)。大--init
標(biāo)志將一個(gè)微小的init進(jìn)程插入容器中作為主進(jìn)程,并在容器退出時(shí)處理所有進(jìn)程的收獲。以這種方式處理這樣的過(guò)程比使用完全的init進(jìn)程(例如sysvinit
,,,upstart
,或systemd
來(lái)處理容器中的流程生命周期。
如果您需要在一個(gè)容器中運(yùn)行多個(gè)服務(wù),您可以通過(guò)幾種不同的方式來(lái)完成這一任務(wù)。
將所有命令放入包裝腳本中,并提供測(cè)試和調(diào)試信息。將包裝器腳本作為CMD
這是一個(gè)很幼稚的例子。首先,包裝器腳本:
#%21/bin/bash#啟動(dòng)第一個(gè)進(jìn)程。[醫(yī)]第一[醫(yī)]進(jìn)程-D狀態(tài)=$?如果$Status-N0;然后回顯“未能啟動(dòng)我的[醫(yī)]第一[醫(yī)]進(jìn)程:$state“退出$Statusfi#啟動(dòng)第二個(gè)進(jìn)程。[醫(yī)]第二[醫(yī)]進(jìn)程-D狀態(tài)=$?如果$Status-N0;然后回顯“未能啟動(dòng)我的[醫(yī)]第二[醫(yī)]Process:$Status“Exit$Statsfi#樸素檢查每分鐘運(yùn)行一次檢查,以查看是否有任何進(jìn)程退出。#這說(shuō)明了如果要在容器中運(yùn)行多個(gè)服務(wù),需要完成的部分工作。如果檢測(cè)到任何一個(gè)進(jìn)程已經(jīng)退出,容器將退出并帶有一個(gè)錯(cuò)誤#。#否則它將永遠(yuǎn)循環(huán),每60秒醒來(lái)一次/bin/true;[醫(yī)]第一[醫(yī)]過(guò)程grep-q-v grep過(guò)程[醫(yī)]一[醫(yī)]狀態(tài)=$?PS輔助grep我[醫(yī)]第二[醫(yī)]過(guò)程grep-q-v grep過(guò)程[醫(yī)]二[醫(yī)]狀態(tài)=$?#如果上面的grep找到了什么,如果它們都不是0,它們將退出0狀態(tài)#,那么如果$Process[醫(yī)]一[醫(yī)]狀態(tài)-n0-o$進(jìn)程[醫(yī)]二[醫(yī)]現(xiàn)狀---N0然后回顯“其中一個(gè)進(jìn)程已經(jīng)退出”。出口-1fi睡眠60完成
接下來(lái),Dockerfile:
來(lái)自u(píng)buntu的最新版本[醫(yī)]第一[醫(yī)]處理我的[醫(yī)]第一[醫(yī)]進(jìn)程復(fù)制我的[醫(yī)]第二[醫(yī)]處理我的[醫(yī)]第二[醫(yī)]進(jìn)程復(fù)制我的[醫(yī)]包裝器[醫(yī)]腳本噓我[醫(yī)]包裝器[醫(yī)]script.sh CMD./我[醫(yī)]包裝器[醫(yī)]script.sh
使用流程管理器,如supervisord
這是一種中等重量的方法,需要你打包。supervisord
以及它在圖像%28中的配置,或者將您的圖像建立在以下內(nèi)容的基礎(chǔ)上:supervisord
%29,以及它將管理的不同應(yīng)用程序。然后你開始supervisord
,它為您管理您的流程。下面是一個(gè)使用這種方法的Dockerfile示例,它假定預(yù)先編寫的supervisord.conf
,,,my_first_process
,和my_second_process
所有文件都與您的Dockerfile位于同一個(gè)目錄中。
來(lái)自u(píng)buntu:最新運(yùn)行APT-獲取更新&APT-獲取安裝-y監(jiān)控器運(yùn)行mkdir-p/var/log/主管復(fù)制Superord.conf/etc/Superor/con.d/visorord.conf復(fù)制我的[醫(yī)]第一[醫(yī)]處理我的[醫(yī)]第一[醫(yī)]進(jìn)程復(fù)制我的[醫(yī)]第二[醫(yī)]處理我的[醫(yī)]第二[醫(yī)]過(guò)程CMD“/usr/bin/Superord”