Docker容器中的节点http-proxy

Moo*_*oon 5 node.js node-http-proxy docker boot2docker

我有以下代码在我的本地环境中运行良好.但是,当我尝试从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);
Run Code Online (Sandbox Code Playgroud)

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

编辑

这是一个Git repo来尝试这种行为; 为简单起见,我已经检查了假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 Code Online (Sandbox Code Playgroud)

run.sh:

#!/bin/sh

/nodejs/bin/node /app/main.js; /nodejs/bin/node /proxy/main.js
Run Code Online (Sandbox Code Playgroud)

hel*_*ert 6

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

/nodejs/bin/node /app/main.js; /nodejs/bin/node /proxy/main.js
Run Code Online (Sandbox Code Playgroud)

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

这意味着您无法访问代理服务器,因为它永远不会启动.

基本上我可以想到两种解决方案.请注意,惯用的"Docker方式"是仅为每个容器运行一个进程.

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

    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
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 另一种解决方案是使用Supervisord流程管理器工具并行管理容器中的多个长时间运行流程.在文档中有一篇很好的文章.它基本归结为以下内容:

    1. 安装supervisord(apt-get install supervisor在Ubuntu中)
    2. 创建配置文件(通常在其中/etc/supervisor/conf.d/yourapplication.conf),您可以在其中配置需要运行的所有服务:

      [supervisord]
      nodaemon=true
      
      [program:application]
      command=/nodejs/bin/node /app/main.js
      
      [program:proxy]
      command=/nodejs/bin/node /proxy/main.js
      
      Run Code Online (Sandbox Code Playgroud)
    3. 然后使用supervisord您的启动命令,例如CMD ["/usr/bin/supervisord"]在Dockerfile中使用.

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