2015-03-09 6 views
35

Sto refactoring un paio di servizi node.js. Tutti loro iniziarono con forever su server virtuali, se il processo si arrestava si riavviavano.Devo usare forever/pm2 in un contenitore (Docker)?

Ora, passando alle strutture di applicazione containerizzate e senza stato, penso che il processo dovrebbe uscire e il contenitore dovrebbe essere riavviato in caso di errore.

È corretto? Ci sono vantaggi o svantaggi?

risposta

40

Il mio take è non utilizzare un supervisore del processo in-container (per sempre, pm2) e invece utilizzare il criterio di riavvio docker tramite lo --restart=always (o uno degli altri aromi di tale opzione). Ciò è più in linea con la filosofia generale della finestra mobile e dovrebbe operare in modo molto simile alla supervisione del processo in-container poiché i contenitori docker iniziano a funzionare molto rapidamente.

Il più forte sostenitore della supervisione del processo in container che ho visto è lo phusion baseimage-docker README se si desidera esplorare l'altra posizione su questo argomento.

+2

perdi implementazioni zero downtime utilizzando finestra mobile, però. Con PM2 bare-metal, è possibile avere distribuzioni a rotazione senza necessità di bilanciamento del carico. – Nepoxx

+20

Uh, solo se si esegue la distribuzione in un contenitore in esecuzione anziché la ricostruzione di un nuovo contenitore con il nuovo codice dell'app, il che distrugge la maggior parte dei vantaggi offerti dalla finestra mobile. Arrestare il tempo di inattività a livello di bilanciamento del carico. Avere più di un'istanza della tua app in esecuzione. –

+0

Un altro punto interessante su questo: se si stesse utilizzando PM2 per avviare istanze multiple come server web, sarà necessario avere il numero N di porte host esposte e gestirlo sull'LB piuttosto che su PM2 come pseudo-LB. Un sacco di astrazioni. * sigh * –

15

Mentre è una buona idea usare --restart=always come un fail-safe, contenitore di riavvio è relativamente lento (5+ secondi con la semplice server Ciao Mondo Nodo descritti here), in modo da può ridurre al minimo i tempi di inattività applicazione usando qualcosa come forever.

Un aspetto negativo di riavviare il processo all'interno del contenitore è che crash recovery ora può accadere due modi, che potrebbero avere implicazioni per il monitoraggio, ecc

+0

utilizza entrambi (per sempre E ricomincia) causa di altri problemi o conflitti? Ho letto qui (https://docs.docker.com/engine/admin/host_integration/#/using-a-process-manager) che l'utilizzo di un gestore di processi con criteri di riavvio potrebbe non essere una buona idea. hai mai provato entrambi? –

+0

PM2 ha uno specifico binario per gestire la finestra mobile in modo che dovrebbe andare bene. Vedi http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/#pm2-docker-helper –