Quali sono i vantaggi della dockerizzazione di nginx e php in diversi contenitori?


18

Ho appena iniziato a lavorare con Docker e Kubernetes e ho visto molte pile, in cui alcune persone costruiscono nginx + php in una singola immagine e alcune costruiscono un'immagine con nginx e un'altra con php (montando lo stesso percorso e racchiudendo entrambi i contenitori nella stessa distribuzione in Kubernetes).

Quali sarebbero i vantaggi della costruzione di due immagini docker anziché l'installazione di nginx + php nella stessa?

Risposte:


19

PHP con nginx viene di solito fatto usando php-fpm che è un processo separato.

Mantenere l'idea di base di una finestra mobile di un processo (vedere la fine della risposta per maggiori dettagli su questo punto) per contenitore ha senso avere il processo nginx e il processo php-fpm in contenitori separati.

Poiché la comunicazione tra nginx e php-fpm avviene attraverso fastcgi, il contenitore php-fpm può anche essere su un host separato e ciò consente di utilizzare un cluster di contenitori php-fpm dietro nginx.

Dopo il wall di commento ecco un po 'più di background, la documentazione docker contiene un paragrafo sull'idea che un container dovrebbe avere solo una preoccupazione .

L'idea principale di un contenitore linux ( lxc ) è quella di eseguire un processo in uno spazio dei nomi isolato a livello di CPU e memoria, Docker aggiunge un isolamento a livello di filesystem.
Il vantaggio è che la compromissione di un processo all'interno di questo spazio dei nomi non permetterà di leggere la memoria di altri processi e come tale dovrebbe impedire altre compromissioni sull'host.

Mentre parlano di nginx e php-fpm, funzionano in coppia ma ognuno ha le proprie preoccupazioni, nginx farà la parte HTTP, il routing, la validazione delle intestazioni, ecc. E php-fpm farà l'interpretazione del codice e restituirà la parte html a nginx . Mentre è normale avere entrambi insieme che servono un'unica applicazione che non è obbligatoria.

A seconda del contesto, potrebbe essere più semplice disporre di un contenitore comprendente l'intero stack per un'applicazione, ad esempio su una workstation di sviluppo. Ma idealmente per l'uso in produzione, cerca di mantenere una minore interazione all'interno del contenitore, avendo separato i processi nello stesso contenitore con supervisord porta la sua parte di problema in termini di processo di zombi e gestione dei registri (esempio qui a solo scopo illustrativo).

Quindi finalmente citerò la pagina della finestra mobile con una certa enfasi:

Mentre "un processo per contenitore" è spesso una buona regola empirica, non è una regola dura e veloce. Usa il tuo miglior giudizio per mantenere i contenitori il più pulito e modulare possibile .

Non esiste una "regola del proiettile d'argento" che si applica a tutto, è sempre un equilibrio tra la complessità all'interno del contenitore e la complessità che orchestra i contenitori stessi.


3
L'idea principale è in realtà "Ogni contenitore dovrebbe avere una sola preoccupazione" e "non è necessariamente vero che dovrebbe esserci un solo processo del sistema operativo per contenitore". docs.docker.com/engine/userguide/eng-image/…
user2640621

Ammetto che è una scorciatoia per colpire l'idea, nginx non è un singolo processo monolitico né è php-fpm, ma sostituisco il processo con preoccupazione nella mia risposta ed è ancora OK nginx fa il routing, php-fpm fa l'interpretazione
Tensibai

3
La risposta è di solito un servizio una porta per contenitore, non un solo processo. D'altra parte, se si hanno più processi in esecuzione in un contenitore, è necessario considerare alcuni processi di inizializzazione, gestione dei servizi, riavvii, registrazione indipendente, dipendenze dei pacchetti indipendenti, diventa un po 'più complicato. E a volte il mapping 1: 1 si trasforma in mapping 1: n durante il ridimensionamento.
Jiri Klouda,

@Jiri interpreta l'avvocato del diavolo: quindi un apache di fronte a un'app di binari che usa un DB postgres dovrebbe andare nello stesso contenitore? Dopo tutto, questo è solo un servizio da un punto di vista esterno.
Tensibai,

1
@JiriKlouda risposta modificata, spero che sia sufficientemente dettagliata per trasmettere tutti i punti sollevati nei commenti.
Tensibai,

4

In realtà, un punto mancante qui è la scalabilità orizzontale. C'è un articolo di Jamie Alquiza molto tempo fa indirizzato a questo:

http://archive.is/pDzz0

In breve, ridimensionate il vostro php-fpm in orizzontale per raggiungere prestazioni più elevate. Scalare Nginx + php-fpm insieme non porta alcun vantaggio. Vi incoraggio a fare alcuni test di stress (ad esempio Tsung, Gatling, ecc .; per favore non fare Apache ab, che è un giocattolo molto vecchio) per verificare ciò che l'articolo ha dichiarato. Personalmente ho diverse esperienze nel mondo reale che hanno dimostrato che l'articolo è vero in generale.

Ma ci sono due svantaggi (forse non per Kubernetes) per le macchine / macchine virtuali bare metal:

  1. Come configurare Nginx per scoprire dinamicamente le modifiche al contenitore php-fpm? Questa è la parte facile.
  2. Come condividiamo lo stesso volume / file system dopo il ridimensionamento? I contenitori Nginx e php-fpm devono leggere esattamente lo stesso contenuto per raggiungere la coerenza. Questo ti lascia la parte meno enigmistica (e la parte più divertente) su cui lavorare.

EDITED: ora è quasi la metà dell'anno 2019. Il vecchio modello, php-fpm + nginx nello stesso pod, ha un uso diverso. Se hai familiarità con la mesh del servizio, allora nginx (o quella che viene chiamata Nginmesh) funge da sidecar per gestire il traffico diretto da est a ovest. Il traffico diretto da est-ovest veniva utilizzato principalmente per l'autenticazione tra servizi o altre funzionalità fantasiose, mentre php-fpm puro non poteva farlo.


3

Non vi è alcun vantaggio significativo che superi la necessità di gestire due container. Finché hai una relazione 1: 1 tra i processi e servono a un unico scopo, inseriscili nello stesso contenitore.


Intendi immagini diverse sullo stesso contenitore?
CarlosAS,

Come avvierai nginx e php-fpm nello stesso contenitore? Aggiungi un esempio
030

1
@ 030 qui un esempio
CarlosAS,

2
@carlos Esempio molto valido per scopi di sviluppo, bloccherei questo tipo di cose per l'uso in produzione (l'esecuzione di supervisord all'interno di un container può trasformare abbastanza facilmente un footgun)
Tensibai,

Non sono d'accordo con questa risposta, con questo ragionamento un server apache con sicurezza mod che parla con un tomcat che parla con un server postgresql che ospita solo un'app dovrebbe adattarsi all'interno di un singolo contenitore.
Tensibai,

-1

Il vantaggio è: è possibile eseguire più contenitori php-fpm in back-end, lo chiamiamo cluster PHP, tramite il numero di porte. Porta di esempio 9000, 9001, 9002 .. e così via

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.