[英]Docker not expose ports for node and webpack dev-server
我有MacOS High Sierra,我的目標是在macOS上運行沒有安裝節點的節點Web應用程序(我想使用docker來做到這一點)。 該Web應用程序通常是angular-webpack(編譯+運行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
是MacO上的目錄,其中包含有角項目。
這是文件/work/tmp/example.js (映射在容器中)中的示例應用程序, 存在該問題的問題(但是,它們的主要目標是找到webpack dev-server的正確配置):
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, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3002/');
所以首先我運行run.cmd
這是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
在容器中,我鍵入命令:
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未發送任何數據。
ERR_EMPTY_RESPONSE
如果我從run.cmd文件中刪除-p 3002:3002
,則瀏覽器響應更改為
127.0.0.1拒絕連接。 嘗試:檢查連接檢查代理和防火牆
ERR_CONNECTION_REFUSED
我也嘗試使用docker run --ip=127.0.0.1...
但我收到消息
docker:來自守護程序的錯誤響應:僅在用戶定義的網絡上支持用戶指定的IP地址。
當我嘗試使用docker run --net=host ...
它什么都沒有改變
我也想提到當我通過docker run -p 3306:3306 ...
運行mysql
映像時docker run -p 3306:3306 ...
我工作正常(!)-可能是node
映像(?)
問題:
subdomain.local:3002
這樣的subdomain.local:3002
? example.js
之上的子域(我需要在單獨的子域的不同端口上運行許多有角度的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
文件。
Rob幫助我找到問題的主要解決方案。 我進行測試和調查,發現當我們設置.listen(3002, '0.0.0.0')
並通過添加如下行來編輯/etc/hosts
,
127.0.0.1 node-test.local
當我們在瀏覽器中輸入node-test.local:3002
,它將起作用。 但是,如果我們使用webpack dev starter,則在瀏覽器中會出現錯誤:
無效的主機頭
因此,我們需要通過添加disableHostCheck: true
重新配置webpack.js文件(例如,在angular-starter框架 ( ASF中,該文件位於./config/webpack.dev.js
)) disableHostCheck: true
true-以下是配置示例:
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(子域)的標准解決方案)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.