2014-10-20 28 views
5

Sto provando a configurare un contenitore Docker di Ubuntu che esegue un'app Node.js HTTP sulla porta 9000. Per simulare il setup dell'ambiente di produzione, vorrei anche eseguire Apache as un semplice server proxy inverso all'interno del contenitore che inoltra a questa app da, diciamo, la porta 80 (che espongo al grande mondo cattivo).Configurazione minima per il proxy inverso Apache nel contenitore Docker

Sono stato in grado di configurare correttamente il contenitore dell'app Node.js e posso installare e configurare Apache nel mio Dockerfile; ma sono completamente nuovo nell'impostare un proxy inverso, quindi mentre Apache inizia certamente, non fa il proxy.

mio Dockerfile sembra qualcosa di simile:

# DOCKER-VERSION 1.3.0 
FROM ubuntu:12.04 

# Install and set up Apache as a reverse proxy 
RUN  apt-get -y install apache2 libapache2-mod-proxy-html 
COPY apache2.conf /etc/apache2/app.conf 
RUN  cat /etc/apache2/app.conf >> /etc/apache2/apache2.conf 
RUN  service apache2 start 

# Install and set up Node.js and bundle app 
# ...This works... 

EXPOSE 80 
CMD  ["./start-app.sh"] 

... dove il apache2.conf sto aggiungendo al /etc/apache2/apache2.conf è:

ServerName localhost 

LoadModule proxy_module  /usr/lib/apache2/modules/mod_proxy.so 
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so 
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so 
LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass  /http://localhost:9000/ 
ProxyPassReverse/http://localhost:9000/ 

Sto facendo funzionare questa immagine usando il seguente comando:

docker run -p 80:80 -p 81:9000 -d IMAGE 

Quello che mi aspetto è quello di andare a http://$DOCKER_HOST (vale a dire, la radice) verrà prelevato da Apache e inoltrato a localhost:9000 (ad esempio, la mia app) nel contenitore. (Se vado a http://$DOCKER_HOST:81, vado direttamente all'app, solo per dimostrare che è attivo e funzionante. Funziona.) Sospetto che il problema non riguardi Docker, ma la configurazione di Apache.

+0

Stai utilizzando il proxy inverso di apache al solo scopo di esporre il tuo server web sulla porta 80 anziché su 9000 o avrebbe un altro scopo? – Thomasleveil

+0

Esattamente. Sulla macchina di produzione, Apache sta facendo altre cose non correlate; Sto solo mettendo il layer reverse proxy nel mio contenitore in modo che corrisponda al setup in produzione. – Xophmeister

+0

Pls modificare la tua domanda con il comando stai usando per eseguire il contenitore di finestra mobile – Thomasleveil

risposta

6

Nel file Docker, le istruzioni RUN definiscono i comandi che verranno eseguiti dal daemon della finestra mobile durante la creazione dell'immagine della finestra mobile. Questi comandi non verranno eseguiti quando si utilizza il comando docker run.

Nel tuo caso si sta tentando di trovare un'immagine finestra mobile che avrebbe iniziare due processi con:

  • server Apache server di
  • nodejs

Ma lo script start-app.sh in CMD ["./start-app.sh"] sembra avvia solo il server nodejs.

Non è possibile avere il comando docker run avviare più di un processo, ma è possibile farlo avviare un processo che ne avvierà altri. Ci sono modi differenti per raggiungere questo obiettivo, dare un'occhiata a:

ma più semplicemente si potrebbe sostituire la vostra istruzione CMD con:

CMD  /bin/bash -c "service apache2 start; ./start-app.sh" 

e rimuovere l'inutile linea RUN service apache2 start.

Nel contenitore, Docker avvierà un processo (/bin/bash) che a sua volta avvierà apache e quindi eseguirà ./start-app.sh.

+0

nota: si potrebbe anche aggiungere 'servizio apache2 start' nella parte superiore dello script' start-app.sh' – Thomasleveil

+0

Che ha fatto il trucco :) Grazie ... in particolare il tuo primo paragrafo ha chiarito tutto per me. – Xophmeister