2014-10-20 3 views
5

포트 9000에서 Node.js HTTP 응용 프로그램을 실행하는 Ubuntu Docker 컨테이너를 설정하려고합니다. 프로덕션 환경의 설정을 모방하기 위해 Apache를 다음과 같이 실행하고 싶습니다. 예를 들어 포트 80 (큰 나쁜 세계에 노출되는)에서이 앱으로 전달되는 컨테이너 내의 간단한 리버스 프록시 서버.Docker 컨테이너의 Apache 역 프록시에 대한 최소 구성

Node.js 앱 컨테이너를 올바르게 설정할 수 있었고 Apache를 설치하고 설정할 수 있습니다. Dockerfile; 하지만 전적으로 역방향 프록시를 설정하는 것이므로 아파치가 확실히 시작되지만 프록시는 아닙니다. 내 Dockerfile

보이는 뭔가 같은 : 나는 다음과 같은 명령을 사용하여 이미지를 실행하고

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/ 

: 나는 /etc/apache2/apache2.conf에 추가하고있어 apache2.conf

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

...

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

내가 기대하는 바는 http://$DOCKER_HOST (루트)은 Apache에 의해 선택되어 컨테이너의 localhost:9000 (즉, 내 앱)으로 전달됩니다. (만약 내가 http://$DOCKER_HOST:81로 간다면, 나는 곧바로 실행되고 있음을 증명하기 위해 앱으로 곧장 간다.)이 문제는 Docker가 아니라 Apache 구성과 관련이 있다고 생각한다.

+0

웹 서버를 9000 대신 포트 80에 노출시키는 목적으로 Apache 역방향 프록시를 사용하고 있습니까? 아니면 다른 용도로 사용 하시겠습니까? – Thomasleveil

+0

정확히. 프로덕션 시스템에서 Apache는 관련없는 다른 작업을 수행합니다. 프로덕션 환경의 설정과 일치하도록 컨테이너에 리버스 프록시 레이어를 넣는 것뿐입니다. – Xophmeister

+0

명령으로 질문을 편집 할 수 있습니다. 도커 컨테이너를 실행하는 데 사용하고 있습니까 – Thomasleveil

답변

6

Dockerfile에서 RUN 문은 고정 이미지를 작성할 때 docker 데몬이 실행할 명령을 정의합니다. 이러한 명령은 docker run 명령을 사용할 때 실행되지 않습니다.

  • 아파치 서버
  • nodejs 서버가

그러나 CMD ["./start-app.sh"]start-app.sh 스크립트가 보인다에게 : 귀하의 경우

는 두 개의 프로세스를 시작할 것 고정 표시기 이미지 마련하려고 nodejs 서버 만 시작하십시오.

docker run 명령은 하나 이상의 프로세스를 시작할 수 없지만 다른 프로세스를 시작하는 프로세스를 시작할 수는 있습니다. 이를 달성하기 differents의 방법이 있습니다, 한 번 봐 걸릴 :

을하지만, 더 간단하게 당신은 당신의 CMD 명령을 대체 할 수 :

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

제거 쓸데없는 RUN service apache2 start 줄.

컨테이너에서 Docker는 하나의 프로세스 (/bin/bash)를 시작하고 차례로 Apache를 시작한 다음 ./start-app.sh을 실행합니다.

+0

참고 :'start-app.sh' 스크립트 상단에'service apache2 start'를 추가 할 수도 있습니다 – Thomasleveil

+0

그 트릭을했습니다. :) 고맙습니다 ... 특히 첫 단락이 모든 것을 정리해주었습니다. – Xophmeister

관련 문제