node.js - Docker 容器中 Apache 反向代理的最小配置

标签 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"]

...我要附加到 /etc/apache2/apache2.confapache2.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/

相关文章:

python - Heroku Node.js + Python

apache - 如何在具有不同端口的apache2/ubuntu14.04中的Flask上安装ssl证书

apache - 如何从 Apache .htaccess 创建虚拟主机?

ajax - 使用文件夹名称填充 JSP 下拉列表

linux - 限制其他 linux 用户访问 docker 容器

mysql - 使用 mariaDB 将 sql 转储文件安装到 docker 容器

javascript - 如何连续搜索现有文档并相应地修改/添加每个文档?

Javascript正则表达式用双引号包裹不带引号的JSON值(不是键)

Node.js - 通过外部 HTTP 代理进行 OAuth

docker - 运行 Celery 任务的 Docker 容器的 HEALTHCHECK?