【问题标题】:Minimal configuration for Apache reverse proxy in Docker containerDocker 容器中 Apache 反向代理的最小配置
【发布时间】: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.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

我所期望的是,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


【解决方案1】:

在您的 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

【讨论】:

  • 注意:你也可以在start-app.sh脚本的顶部添加service apache2 start
  • 成功了 :) 谢谢...特别是您的第一段为我清除了一切。
  • 这不要求我以 root 身份运行我的容器service apache2 start 吗?有没有办法让普通用户完成任务?
  • @fy_iceworld 我建议无论如何运行两个容器,一个用于 Apache(来自官方 docker 映像),一个用于您的应用程序。您不会遇到以这种方式以 root 身份运行容器的问题。或者使用 Traefik 而不是 Apache 作为反向代理角色
  • @Thomasleveil 我明白了。感谢您的快速回复!
猜你喜欢
  • 2019-05-18
  • 2021-09-30
  • 2015-04-26
  • 1970-01-01
  • 2019-01-14
  • 2021-05-04
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多