2015-10-14 25 views
23

Non sto chiedendo l'uso del supervisore con i dockers ma voglio solo che la mia comprensione sia convalidata.Uso del supervisore nella finestra mobile

Capisco che la finestra mobile esegue un singolo processo quando è in esecuzione. Inoltre, il supervisore viene utilizzato quando è necessario eseguire più processi all'interno del contenitore.

Ho visto diversi esempi in cui un contenitore viene avviato dall'immagine di base e diversi servizi sono installati e il contenitore è impegnato a formare una nuova immagine, il tutto senza supervisore.

Quindi, il mio dubbio di base era qual è la differenza tra entrambi gli approcci.

La mia comprensione è che quando il contenitore docker viene arrestato invia un segnale di kill al processo con PID 1, PID 1 gestisce il processo figlio e interrompe tutto il bambino che è esattamente ciò che viene fatto dal supervisore, mentre possiamo installare più processi senza supervisore può essere eseguito un solo processo quando viene eseguita la finestra mobile e quando il contenitore viene arrestato, solo il PID 1 verrà inviato segnali e l'altro processo in esecuzione non verrà arrestato correttamente.

Si prega di confermare quanto la mia comprensione sull'uso di supervisord è corretta.

Grazie

+0

Aggiornamento Sett 2016: vedere [la mia nuova risposta ] (http://stackoverflow.com/a/39593409/6309) di seguito: il daemon docker potrebbe occuparsi di quei processi zombi per te nella finestra mobile 1.12. – VonC

risposta

38

mentre possiamo installare processo multiplo senza supervisore, solo un processo può essere eseguito quando conduzione finestra mobile viene emesso e quando il contenitore viene arrestata solo il PID 1 saranno trasmessi segnali e altri processi in esecuzione no essere fermato con grazia

Sì, anche se dipende da come viene eseguito il processo principale (in primo piano o in background) e come raccoglie i processi figli.

Questo è ciò che è descritto nel "Trapping signals in Docker containers"

docker stop ferma un contenitore in esecuzione con l'invio del segnale SIGTERM, lasciare che il processo di processo principale, e dopo un periodo di grazia utilizza SIGKILL per terminare l'applicazione.

Il segnale inviato al contenitore viene gestito dal processo principale in esecuzione (PID 1).

Se l'applicazione è in primo piano, ovvero l'applicazione è il processo principale in un contenitore (PID1), può gestire direttamente i segnali.

Ma:

Il processo deve essere segnalata potrebbe essere lo sfondo uno e non è possibile inviare direttamente i segnali. In questo caso, una soluzione consiste nell'impostare uno script di shell come punto di accesso e orchestrare tutta l'elaborazione del segnale in quello script.

La questione è ulteriormente trattati nella "Docker and the PID 1 zombie reaping problem"

Unix è progettato in modo tale che i processi genitori devono esplicitamente "attesa" per la terminazione processo figlio, al fine di raccogliere il suo stato di uscita.Il processo zombie esiste fino a quando il processo padre ha eseguito questa azione, utilizzando la famiglia di chiamate di sistema waitpid().

L'azione di chiamare waitpid() su un processo figlio per eliminare il suo zombi, viene chiamata "mietitura".

Il processo init - PID 1 - ha un compito speciale. Il suo compito è di "adottare" processi figli orfani.

https://blog.phusion.nl/wp-content/uploads/2015/01/adoption.png

Il sistema operativo si aspetta che il processo init di raccogliere i bambini adottati troppo.

problema con Docker:

vediamo che un sacco di gente correre solo un processo nel loro contenitore, e pensano che quando corrono questo singolo processo, hanno finito.
Ma molto probabilmente, questo processo non viene scritto per comportarsi come un processo di init corretto.
Cioè, invece di appropriarsi correttamente dei processi, probabilmente si aspetta un altro processo init per fare quel lavoro, e giustamente.

L'utilizzo di un'immagine come phusion/baseimage-docker consente di gestire uno o più processi mantenendo un processo principale conforme a init.

Esso utilizza runit instead of supervisord, per la gestione multi-processo:

Runit non è lì per risolvere il problema mietitura. Piuttosto, è per supportare più processi. Sono incoraggiati più processi per la sicurezza (attraverso il processo e l'isolamento dell'utente).
Runit utilizza meno memoria di Supervisord perché Runit è scritto in C e Supervisord in Python.
E in alcuni casi di utilizzo, il riavvio del processo nel contenitore è preferibile rispetto ai riavvii di interi contenitori.

Questa immagine include uno my_init script che si occupa del problema "mietitura".

In baseimage-docker, si consiglia di eseguire più processi in un unico contenitore. Non necessariamente servizi multipli però.
Un servizio logico può essere costituito da più processi del sistema operativo e forniamo le funzionalità per farlo facilmente.

+0

Grazie per la tua risposta elaborata. Sto cercando l'immagine di phusion e, come ho capito, ogni volta che il contenitore si avvia esegue qualunque cosa si trovi in ​​/etc/init.d. Ma, ho un servizio nel init.d che non sta iniziando sul boot del contenitore. Puoi per favore aiutare. – user3275095

+0

Certo: puoi fare una nuova domanda, con i dettagli del tuo nuovo setup? In questo modo, io (e potenzialmente altri) posso dare un'occhiata. – VonC

+0

Oh ... il mio errore è /etc/my_init.d – user3275095

10

Aggiornamento settembre 2016 per la finestra mobile 1.12 (Q4 2016/Q1 2017)

Arnaud Porterie solo twitted:

[] Proprio fusa: con docker run --init, Rick Grimes si prenderà cura di tutti i vostri zombie.

(commit eabae09)

Vedi PR 26061: "Aggiungi processo init per Zombie combattimenti e segnale gestione" (e PR 26736)

Questo aggiunge un piccolo binario C per la lotta contro gli zombie. È montato sotto /dev/init ed è anteposto agli argomenti specificati dall'utente. Si abilitarlo tramite un flag daemon, dockerd --init, in quanto è disabilitato da di default per compat retro.

Si può anche ignorare l'opzione daemon o specificare questo su ogni base contenitore con docker run --init=true|false.

È possibile verificare ciò eseguendo un processo come questo come il pid 1 in un contenitore e vedere lo zombi extra visualizzato nel contenitore mentre è in esecuzione .

int main(int argc, char ** argv) { 
    pid_t pid = fork(); 
    if (pid == 0) { 
     pid = fork(); 
     if (pid == 0) { 
      exit(0); 
     } 
     sleep(3); 
     exit(0); 
    } 
    printf("got pid %d and exited\n", pid); 
    sleep(20); 
} 

Il docker daemon ha ora l'opzione

--init 

Eseguire un init all'interno di contenitori di trasmettere segnali e raccogliere i processi

+0

Grazie per l'aggiornamento. – user3275095

Problemi correlati