簡體   English   中英

Docker不公開節點和Webpack開發服務器的端口

[英]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映像(?)

問題:

  1. 如何“解除阻止”容器中的端口3002以允許主機瀏覽器與容器中的服務連接?
  2. 如何也使用像subdomain.local:3002這樣的subdomain.local:3002
  3. 如何使用webpack devServer (用在angular中)而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM