Минимальная конфигурация обратного прокси Apache в контейнере Docker

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

Мне удалось правильно настроить контейнер приложения 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.


person Xophmeister    schedule 20.10.2014    source источник
comment
Используете ли вы обратный прокси-сервер apache с единственной целью - выставить свой веб-сервер на порт 80 вместо 9000, или у него будет другая цель?   -  person Thomasleveil    schedule 21.10.2014
comment
Точно. На производственной машине Apache выполняет другие, не связанные с этим вещи; Я просто помещаю слой обратного прокси в свой контейнер, чтобы он соответствовал настройке в производстве.   -  person Xophmeister    schedule 21.10.2014
comment
Пожалуйста, отредактируйте свой вопрос с помощью команды, которую вы используете для запуска контейнера докеров.   -  person Thomasleveil    schedule 21.10.2014
comment
@Thomasleveil Отредактировано   -  person Xophmeister    schedule 21.10.2014


Ответы (1)


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

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

  • сервер apache
  • сервер nodejs

Но сценарий start-app.sh в CMD ["./start-app.sh"], похоже, запускает только сервер nodejs.

Вы не можете заставить команду docker run запускать более одного процесса, но вы можете заставить ее запускать процесс, который запустит другие. Есть разные способы добиться этого, взгляните на:

но, проще говоря, вы можете заменить свою CMD инструкцию на:

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

и удалите бесполезную строку RUN service apache2 start.

В вашем контейнере Docker запустит один процесс (/bin/bash), который, в свою очередь, запустит apache, а затем запустит ./start-app.sh.

person Thomasleveil    schedule 21.10.2014
comment
примечание: вы также можете добавить service apache2 start вверху start-app.sh скрипта - person Thomasleveil; 21.10.2014
comment
Это помогло :) Спасибо ... в частности, ваш первый абзац прояснил для меня все. - person Xophmeister; 21.10.2014