Node.js Docker未公开节点和Web包开发服务器的端口
我有MacOS High Sierra,我的目标是在MacOS上运行无需安装节点的节点web应用程序(我想使用docker来实现)。该web应用程序通常是有角度的web包(编译+运行dev-serwer) Dockerfile: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…
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 bydocker run-p3306:3306…
I工作正常(!)-所以可能是node
image(?)
问题:
subdomain.local:3002
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
当我们输入browsernode 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
当我们输入browsernode 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
它可以工作)然而,问题的第二部分——子域(这是