【发布时间】:2014-12-15 22:57:15
【问题描述】:
我正在尝试设置一个 Ubuntu Docker 容器,该容器在端口 9000 上运行 Node.js HTTP 应用程序。为了模拟生产环境的设置,我还想在容器中运行 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"]
...我附加到/etc/apache2/apache2.conf 的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
我所期望的是,Apache 会拾取 http://$DOCKER_HOST(即根目录)并转发到容器中的 localhost:9000(即我的应用程序)。 (如果我去http://$DOCKER_HOST:81,我会直接进入应用程序;只是为了证明它已经启动并运行。这是可行的。)我怀疑问题根本与 Docker 无关,而与 Apache 配置有关。
【问题讨论】:
-
您使用 apache 反向代理的唯一目的是在端口 80 而不是 9000 上公开您的 Web 服务器,还是有其他目的?
-
没错。在生产机器上,Apache 正在做其他不相关的事情;我只是将反向代理层放在我的容器中,以便它与生产中的设置相匹配。
-
请使用您用来运行 docker 容器的命令编辑您的问题
-
@Thomasleveil 已编辑
标签: node.js apache docker reverse-proxy mod-proxy