2014-10-20 19 views
5

Próbuję skonfigurować kontener Docker w Ubuntu, który uruchamia aplikację HTTP Node.js na porcie 9000. Aby naśladować konfigurację środowiska produkcyjnego, chciałbym również uruchomić Apache jako prosty odwrotny serwer proxy w kontenerze, który przekazuje tę aplikację z, powiedzmy, portu 80 (który ujawniam dużemu złemu światu).Minimalna konfiguracja dla odwrotnego proxy Apache w kontenerze Docker

Byłem w stanie skonfigurować kontener aplikacji Node.js w porządku i mogę zainstalować i skonfigurować Apache w moim Dockerfile; ale jestem całkowicie nowy w tworzeniu odwrotnego proxy, więc podczas gdy Apache na pewno zaczyna, nie ma proxy.

Moja Dockerfile wygląda mniej więcej tak:

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

... gdzie apache2.conf jestem dołączanie do /etc/apache2/apache2.conf jest:

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/ 

Używam tego obrazu za pomocą następującego polecenia:

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

Spodziewam się, że będzie http://$DOCKER_HOST (tj. Root) zostanie pobrane przez Apache i przesłane do localhost:9000 (tj. Mojej aplikacji) w kontenerze. (Jeśli przejdę na stronę http://$DOCKER_HOST:81, przejdę od razu do aplikacji, aby udowodnić, że działa i działa.) Podejrzewam, że problem nie dotyczy w ogóle Dockera, ale konfiguracji Apache.

+0

Czy korzystasz z odwrotnego proxy Apache wyłącznie w celu udostępnienia serwera WWW na porcie 80 zamiast 9000, czy też miałby on inny cel? – Thomasleveil

+0

Dokładnie. Na maszynie produkcyjnej Apache robi inne, niezwiązane ze sobą rzeczy; Właśnie umieszczam warstwę odwrotnego proxy w moim kontenerze, tak aby pasowała do konfiguracji w produkcji. – Xophmeister

+0

Pls edytować pytanie za pomocą polecenia używasz do uruchomienia kontenera dokowania – Thomasleveil

Odpowiedz

6

W pliku Dockerfile instrukcje RUN definiują polecenia, które będą uruchamiane przez demona docker podczas budowania obrazu dokowanego. Te polecenia nie zostaną wykonane po użyciu polecenia docker run.

W twoim przypadku staramy się wymyślić obrazu Döcker że rozpoczęcie dwa procesy:

  • serwer apache serwer
  • nodejs

Ale skrypt start-app.sh w CMD ["./start-app.sh"] wydaje tylko uruchom serwer nodejs.

Nie można wykonać polecenia docker run więcej niż jednego procesu, ale można uruchomić proces, który uruchomi inne. Istnieje differents sposoby osiągnięcia tego celu, przyjrzeć:

ale prościej można zastąpić swoją dyspozycję CMD z:

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

i usunąć bezużyteczna linia RUN service apache2 start.

W twoim pojemniku, Docker rozpocznie jeden proces (/bin/bash), który z kolei uruchomi Apache, a następnie uruchomi ./start-app.sh.

+0

Uwaga: można również dodać 'service apache2 start' na górze skryptu' start-app.sh' – Thomasleveil

+0

To zrobiło sztuczkę :) Dziękuję ... szczególnie twój pierwszy akapit oczyścił wszystko dla mnie. – Xophmeister

Powiązane problemy