我正在尝试设置一个在端口9000上运行Node.js HTTP应用程序的Ubuntu Docker容器。为了模拟生产环境的设置,我还想将Apache作为容器中的简单反向代理服务器运行,并将其转发到此容器例如来自端口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配置有关。
在您的Dockerfile中,RUN语句定义在构建Docker映像时将由Docker守护程序运行的命令。使用docker run
命令时,这些命令将不会执行。
在您的情况下,您尝试提出一个将启动两个过程的docker映像:
但是其中的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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句