Docker容器中Apache反向代理的最小配置

时间:2014-10-20 20:36:44

标签: node.js apache docker reverse-proxy mod-proxy

我正在尝试设置一个在端口9000上运行Node.js HTTP应用程序的Ubuntu Docker容器。为了模仿生产环境的设置,我还希望将Apache作为容器内的简单反向代理服务器运行从端口80转发到这个应用程序(我暴露在这个大坏世界)。

我已经能够很好地设置Node.js应用容器了,我可以在Dockerfile内安装和设置Apache;但我对设置反向代理完全不熟悉,所以当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配置

1 个答案:

答案 0 :(得分:6)

在Dockerfile中,RUN语句定义了在构建docker镜像时docker守护程序将运行的命令。使用docker run命令时,不会执行这些命令。

在你的情况下,你试图想出一个可以启动两个进程的docker镜像:

  • apache server
  • nodejs server

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