Node.js Docker未公开节点和Web包开发服务器的端口

Node.js Docker未公开节点和Web包开发服务器的端口,node.js,docker,webpack,server,port,Node.js,Docker,Webpack,Server,Port,我有MacOS High Sierra,我的目标是在MacOS上运行无需安装节点的节点web应用程序(我想使用docker来实现)。该web应用程序通常是有角度的web包(编译+运行dev-serwer) Dockerfile: FROM node WORKDIR /work CMD while true; do sleep 10000; done EXPOSE 3002 行CMD while…使容器在运行后不会被docker杀死-这允许我们“登录”到容器中(通过docker exec-it…

我有MacOS High Sierra,我的目标是在MacOS上运行无需安装节点的节点web应用程序(我想使用docker来实现)。该web应用程序通常是有角度的web包(编译+运行dev-serwer)

Dockerfile

FROM node
WORKDIR /work
CMD while true; do sleep 10000; done
EXPOSE 3002
CMD while…
使容器在运行后不会被docker杀死-这允许我们“登录”到容器中(通过
docker exec-it…

运行容器的Bash脚本run.cmd

set -e
docker build -t node-cmd .
docker rm -f node-cmd |:
docker run -d --name node-cmd -p 3002:3002 -v /Volumes/work:/work node-cmd
docker exec -it node-cmd /bin/bash
其中
/Volumes/work
是我的MacOs上包含角度项目的目录

下面是文件/work/tmp/example.js(映射到容器中)中的示例应用程序,对于该应用程序,问题是显而易见的(但它们的主要目标是找到webpack dev服务器的正确配置):

首先,我运行
run.cmd
——下面是docker ps编写的内容:

CONTAINER ID        IMAGE               COMMAND                   CREATED             STATUS              PORTS                    NAMES
e22188d8e136        node-cmd            "/bin/sh -c 'echo \"R…"   16 seconds ago      Up 15 seconds       0.0.0.0:3002->3002/tcp   node-cmd
容器内部I类型命令:

root@5cd3773e7815:/work# cd tmp
root@5cd3773e7815:/work# node example.js & 
[1] 18
root@5cd3773e7815:/work/tmp# Server running at http://127.0.0.1:3002/
所以,塞尔沃开始了。现在我测试:

root@5cd3773e7815:/work/tmp# curl 127.0.0.1:3002
Hello World
所以在docker里面一切都很好。现在,当我进入macos Chrome浏览器
http://127.0.0.1:3002
我明白了

此页面无法工作127.0.0.1未发送任何数据

错误\u空\u响应

如果我从run.cmd文件中删除
-p 3002:3002
,浏览器响应将更改为

127.0.0.1拒绝连接。尝试:检查连接检查代理和防火墙

错误连接被拒绝

我还尝试使用docker run--ip=127.0.0.1…,但我得到的消息是

docker:来自守护进程的错误响应:用户指定的IP地址为 仅在用户定义的网络上受支持

当我尝试使用
dockerrun--net=host…
时,它不会改变任何东西

我还想提到的是,当我运行
mysql
image by
docker run-p3306:3306…
I工作正常(!)-所以可能是
node
image(?)

问题:

  • 如何在容器中“解除阻止”端口3002,以允许主机浏览器与容器内的服务连接
  • 如何使用子域,如
    subdomain.local:3002
  • 如何使用webpack devServer(在angular中使用)而不是上面的
    example.js
    (我需要在不同的端口上运行多个angular web应用程序,每个应用程序都有单独的子域)

  • 我认为这个问题可能与您将
    127.0.0.1
    指定为主机有关。尝试改用
    0.0.0.0

    var http = require('http');
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n'+new Date);
    }).listen(3002, '0.0.0.0');
    

    对于子域,您很可能必须在本地计算机上编辑
    /etc/hosts
    文件。

    我认为此问题可能与您将
    127.0.0.1
    指定为主机有关。尝试改用
    0.0.0.0

    var http = require('http');
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n'+new Date);
    }).listen(3002, '0.0.0.0');
    
    对于子域,您很可能必须在本地计算机上编辑
    /etc/hosts
    文件。

    帮助我找到问题的主要解决方案。我做了测试和调查,发现当我们设置
    时,监听(3002,'0.0.0.0')
    并通过添加行编辑
    /etc/hosts

    127.0.0.1 node-test.local
    
    当我们输入browser
    node test.local:3002
    时,它会工作。但是,如果我们使用webpack dev starter,在浏览器中会出现错误:

    无效的主机头

    因此,我们需要通过添加
    disableHostCheck:true
    ,将webpack.js文件(例如(ASF)重新整合到
    /config/webpack.dev.js
    )中-以下是配置示例:

    devServer: {
      port: "3002",            // in ASF is METADATA.port,
      host: "0.0.0.0",         // in ASF is METADATA.host,     
      public: "0.0.0.0:3002",  // in ASF is METADATA.public,
      disableHostCheck: true,
      //...
    }
    
    之后
    http://node-test.local:3002
    应适用于MacOs浏览器

    如果我们需要在一个端口号上有许多子域(这超出了问题的范围),那么我们可能必须使用(这可能是端口80上docker multi-WebApp(子域)的标准解决方案)

    帮助我找到问题的主要解决方案。我做了测试和调查,发现当我们设置
    时,监听(3002,'0.0.0.0')
    并通过添加行编辑
    /etc/hosts

    127.0.0.1 node-test.local
    
    当我们输入browser
    node test.local:3002
    时,它会工作。但是,如果我们使用webpack dev starter,在浏览器中会出现错误:

    无效的主机头

    因此,我们需要通过添加
    disableHostCheck:true
    ,将webpack.js文件(例如(ASF)重新整合到
    /config/webpack.dev.js
    )中-以下是配置示例:

    devServer: {
      port: "3002",            // in ASF is METADATA.port,
      host: "0.0.0.0",         // in ASF is METADATA.host,     
      public: "0.0.0.0:3002",  // in ASF is METADATA.public,
      disableHostCheck: true,
      //...
    }
    
    之后
    http://node-test.local:3002
    应适用于MacOs浏览器


    如果我们需要在一个端口号上有多个子域(这超出了这个问题的范围),那么我们可能必须使用(这可能是端口80上docker multi-webapps(子域)的标准解决方案)

    您使用的是什么版本的docker?
    docker-v
    docker version 18.06.0-ce,构建0FFA825当从主机进行测试时,您是否可以使用容器的IP地址而不是127.0.0.1?当我运行
    docker inspect node cmd | grep“IPAddress”
    获取此地址时,我会得到:“SecondaryIPaddress”:null,“IPAddress”:”“IPAddress”:”,(我的docker安装是全新的-我是在2天前安装的,除了通过
    docker pull下载图像外,没有任何更改
    )然后可能会有所帮助。您使用的是什么版本的docker?
    docker-v
    docker版本18.06.0-ce,构建0FFA825当从主机进行测试时,您可以使用容器的IP地址而不是127.0.0.1吗?当我运行
    docker inspect node cmd | grep“IPAddress”
    获取此地址时,我得到:“SecondaryIPAddresss”:null,“IPAddress:”,“IPAddress:”(我的docker安装是新的-我在2天前安装了它,除了通过
    docker pull下载图像
    )外,没有任何更改),然后可能会有所帮助。我尝试了你的解决方案-有效(即使我键入
    http://localhost:3002
    它可以工作)然而,问题的第二部分——子域(这是