我正在尝试设置一个在端口 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"]
...我要附加到 /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
我期待的是,前往 http://$DOCKER_HOST
(即根目录)将由 Apache 获取并转发至 localhost:9000
(即我的应用程序)在容器中。 (如果我转到 http://$DOCKER_HOST:81
,我会直接转到该应用程序;只是为了证明它已启动并正在运行。这有效。)我怀疑问题不在都与 Docker 有关,但与 Apache 配置有关。
最佳答案
在您的 Dockerfile 中,RUN语句定义在构建 docker 镜像时将由 docker 守护进程运行的命令。当您使用 docker run
命令时,不会执行这些命令。
在您的情况下,您正试图提出一个将启动两个进程的 docker 镜像:
- apache 服务器
- nodejs 服务器
但是 CMD ["./start-app.sh"]
中的 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
。
关于node.js - Docker 容器中 Apache 反向代理的最小配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474476/