2014-10-20 2 views
5

Я пытаюсь настроить контейнер Ubuntu Docker, который запускает HTTP-приложение Node.js на порте 9000. Чтобы имитировать настройку производственной среды, я также хотел бы запустить Apache как простой обратный прокси-сервер в контейнере, который пересылает это приложение, например, через порт 80 (который я выставляю в большой плохой мир).Минимальная конфигурация для обратного прокси-сервера Apache в контейнере Docker

Я смог настроить контейнер приложения Node.js в порядке, и я могу установить и настроить Apache в моем Dockerfile; но я совершенно не новичок в создании обратного прокси-сервера, поэтому, несмотря на то, что Apache, конечно же, запускается, он не прокси.

Dockerfile Моего выглядит что-то вроде:

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

... где apache2.conf я добавление к /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/ 

Я бег этого изображения с помощью следующей команды:

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

Что я ожидаю, так это то, что будет http://$DOCKER_HOST (т. Е. Корень) будет подхвачен Apache и перенаправлен в localhost:9000 (то есть мое приложение) в контейнере. (Если я перейду к http://$DOCKER_HOST:81, я сразу приложу к этому приложению, просто чтобы доказать, что он работает и работает. Это работает.) Я подозреваю, что проблема вовсе не связана с Docker, а с конфигурацией Apache.

+0

Вы используете обратный прокси-сервер apache с единственной целью разоблачить ваш веб-сервер на порту 80 вместо 9000 или у него будет другая цель? – Thomasleveil

+0

Точно. На производственной машине Apache делает другие, несвязанные вещи; Я просто помещаю обратный прокси-слой в свой контейнер, чтобы он соответствовал настройке в процессе производства. – Xophmeister

+0

Pls отредактируйте ваш вопрос с помощью команды, которую вы используете для запуска вашего контейнера докеров – Thomasleveil

ответ

6

В вашем файле Docker операторы RUN определяют команды, которые будут выполняться демоном докеров при создании образа докера. Эти команды не будут выполняться при использовании команды docker run.

В вашем случае, если вы пытаетесь придумать Docker образ, который начал бы два процесса:

  • Сервер Apache
  • nodejs сервер

Но start-app.sh сценарий в CMD ["./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

примечание: вы также можете добавить 'service apache2 start' в начало скрипта' start-app.sh' – Thomasleveil

+0

Это сделало трюк :) Спасибо ... особенно ваш первый абзац очистил все для меня. – Xophmeister

Смежные вопросы