在Docker容器中configurationhttp-proxy

我有以下代码,在我的本地环境中工作得很好。 但是,当我尝试从Docker容器(通过Boot2Docker)运行相同的代码时,我根本无法访问https:// [boot2docker_ip]:4000

我试着在下面的代码中用所有这些选项来更新目标值,但是没有一个似乎能够做到这一点:

target: 'http://localhost:3000',
target: 'http://0.0.0.0:3000',
target: 'http://127.0.0.1:3000',
target: 'http://<boot2docker_ip>:3000',

 var fs = require('fs'); require('http-proxy').createProxyServer({ ssl: { key: fs.readFileSync(__dirname + '/certs/ssl.key', 'utf8'), cert: fs.readFileSync(__dirname + '/certs/ssl.crt', 'utf8') }, target: 'http://localhost:3000', ws: true, xfwd: true }).listen(4000); 

我使用https://github.com/nodejitsu/node-http-proxy中的node-http-proxy软件包

编辑

这里是一个Git回购试试这个行为; 为了简单起见,我检查了伪造的SSL。

Dockerfile:

 FROM readytalk/nodejs ADD ./src /app ADD ./ssl-proxy /proxy COPY ./run.sh /run.sh RUN chmod +x /run.sh EXPOSE 3000 EXPOSE 4000 ENTRYPOINT ["/run.sh"] 

run.sh:

 #!/bin/sh /nodejs/bin/node /app/main.js; /nodejs/bin/node /proxy/main.js 

我只是看看你的Dockerfile,特别是你使用的run.sh脚本。 这一行来自你的run.sh脚本:

 /nodejs/bin/node /app/main.js; /nodejs/bin/node /proxy/main.js 

这里要知道的重要一点是每个命令都会启动一个长期运行的服务器进程(理论上)永远运行。 这意味着第二个进程( /proxy/main.js )永远不会启动,因为shell将等待第一个进程完成。

这意味着你不能访问你的代理服务器,因为它永远不会启动

基本上有两个解决scheme,我可以想到。 请注意,惯用的“Docker方法”是只为每个容器运行一个进程

  1. 我build议在两个单独的容器中运行您的应用程序和代理服务器。 您可以将这两个容器链接在一起 :

     docker run --name app -p 3000 <your-image> /nodejs/bin/node /app/main.js docker run --name proxy -l app:app -p 4000:4000 <your-image> /nodejs/bin/node /proxy/main.js 

    标志-l app:app将导致app容器与proxy容器中的主机名app一起使用(这是通过在容器中创build/etc/hosts条目来完成的)。 这意味着,在代理容器内,您可以使用http://app:3000来访问您的上游应用程序端口。

  2. 另一种解决scheme是使用像Supervisord这样的进程pipe理器工具来并行pipe理容器中的几个长时间运行的进程。 文档中有一篇很好的文章 。 基本上归结为以下几点:

    1. 在Ubuntu中安装supervisord( apt-get install supervisor
    2. 创build一个configuration文件(通常在/etc/supervisor/conf.d/yourapplication.conf ),在其中configuration所有需要运行的服务:

       [supervisord] nodaemon=true [program:application] command=/nodejs/bin/node /app/main.js [program:proxy] command=/nodejs/bin/node /proxy/main.js 
    3. 然后使用supervisord作为你的启动命令,例如在Dockerfile中使用CMD ["/usr/bin/supervisord"]

    在这种情况下,两个进程都在同一个容器中运行,您可以使用http://localhost:3000来访问上游应用程序。