2014-10-20 10 views
5

Ich versuche einen Ubuntu Docker Container einzurichten, der eine Node.js HTTP App auf Port 9000 ausführt. Um das Setup der Produktionsumgebung nachzuahmen, möchte ich auch Apache als ausführen ein einfacher Reverse-Proxy-Server innerhalb des Containers, der von Port 80 an diese App weiterleitet (die ich der großen, schlechten Welt aussetze).Minimale Konfiguration für Apache Reverse Proxy im Docker Container

Ich war in der Lage, die Node.js App Container fein einzurichten und ich kann Apache in meinem Dockerfile installieren und einrichten; aber ich bin völlig neu beim Einrichten eines Reverse-Proxy, also während Apache sicherlich startet, Proxy nicht.

Mein Dockerfile sieht ungefähr so ​​aus:

# 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"] 

... wo die apache2.conf ich /etc/apache2/apache2.conf bin Anfügen ist:

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/ 

ich dieses Bild bin mit dem folgenden Befehl:

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

Was ich erwarte ist, dass zugehen(d. H. Der Stamm) wird von Apache abgeholt und im Container an localhost:9000 (d. H. Meine App) weitergeleitet. (Wenn ich zu http://$DOCKER_HOST:81 gehe, gehe ich direkt zur App; nur um zu beweisen, dass es läuft und läuft. Das funktioniert.) Ich vermute, dass das Problem gar nicht mit Docker zu tun hat, sondern die Apache-Konfiguration.

+0

Verwenden Sie den Apache Reverse Proxy nur für den Zweck, Ihren Webserver auf Port 80 statt 9000 verfügbar zu machen, oder hätte er einen anderen Zweck? – Thomasleveil

+0

Genau. Auf der Produktionsmaschine macht Apache andere, nicht verwandte Sachen; Ich setze gerade den Reverse-Proxy-Layer in meinen Container, damit er mit dem Setup in der Produktion übereinstimmt. – Xophmeister

+0

Pls bearbeiten Sie Ihre Frage mit dem Befehl verwenden Sie, um Ihre Docker-Container – Thomasleveil

Antwort

6

In Ihrer Dockerfile definieren die RUN Anweisungen Befehle, die vom Docker-Dämon beim Erstellen des Docker-Images ausgeführt werden. Diese Befehle werden nicht ausgeführt, wenn Sie den Befehl docker run verwenden.

In Ihrem Fall Sie versuchen, mit einem Docker Bild zu entwickeln, die zwei Prozesse beginnen würde:

  • Apache-Server
  • NodeJS Server

Aber das start-app.sh Skript in CMD ["./start-app.sh"] scheint starte nur den nodejs server.

Sie können den Befehl docker run nicht mehr als einen Prozess starten lassen, aber Sie können einen Prozess starten lassen, der andere startet. Es gibt differents Möglichkeiten, dies zu erreichen, werfen Sie einen Blick auf:

aber einfacher können Sie Ihre CMD Anweisung ersetzen:

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

und entfernen die nutzlose RUN service apache2 start Linie.

In Ihrem Container startet Docker einen Prozess (/bin/bash), der wiederum Apache startet und dann ./start-app.sh ausführt.

+0

Hinweis: Sie können auch 'Service apache2 Start' am Anfang des' start-app.sh' Skript – Thomasleveil

+0

Das tat den Trick :) Danke ... besonders dein erster Absatz hat alles für mich erledigt. – Xophmeister