Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Docker容器中Apache反向代理的最低配置_Node.js_Apache_Docker_Reverse Proxy_Mod Proxy - Fatal编程技术网

Node.js Docker容器中Apache反向代理的最低配置

Node.js Docker容器中Apache反向代理的最低配置,node.js,apache,docker,reverse-proxy,mod-proxy,Node.js,Apache,Docker,Reverse Proxy,Mod Proxy,我正在尝试设置一个Ubuntu Docker容器,它在端口9000上运行Node.js HTTP应用程序。为了模拟生产环境的设置,我还想在容器中运行Apache作为一个简单的反向代理服务器,从端口80(我将其暴露在大坏世界中)转发到此应用程序 我已经能够很好地设置Node.js应用程序容器,并且可以在我的Dockerfile中安装和设置Apache;但我对设置反向代理完全是新手,所以虽然Apache肯定会启动,但它不会进行代理 我的Dockerfile看起来像: # DOCKER-VERSION

我正在尝试设置一个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/
我所期望的是,Apache将获取http://$DOCKER\u HOST(即root)并将其转发到容器中的
localhost:9000(即我的应用程序)。(如果我转到http://code>http://$DOCKER\u HOST:81
,我会直接转到应用程序;只是为了证明它已启动并正在运行。这是有效的。)我怀疑问题根本与DOCKER无关,而是与Apache配置有关。

在DOCKER文件中,这些语句定义了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"
并删除无用的
运行服务apache2 start


在您的容器中,Docker将启动一个进程(
/bin/bash
),该进程将启动apache,然后运行
/start app.sh

您使用apache反向代理的唯一目的是在端口80而不是9000上公开web服务器,还是有其他目的?完全正确。在生产机器上,Apache正在做其他无关的事情;我只是将反向代理层放在我的容器中,以便它与生产中的设置相匹配。请使用您用于运行docker的命令编辑您的问题container@Thomasleveil编辑说明:您还可以在
start app.sh
脚本的顶部添加
service apache2 start
,完成此操作:)谢谢你…特别是你的第一段为我澄清了一切。
CMD     /bin/bash -c "service apache2 start; ./start-app.sh"