无法连接到主机的(显示,发布)端口

我正在通过一个React.js教程,我决定在一个Docker容器中工作。 这是本教程的代码。

本教程使用在容器上的端口8080上运行的webpack-dev-server 。 我在Dockerfile公开了这个端口,并且用-P运行我的容器来发布这个端口。 在容器内部,如果我使用wget http://localhost:8080 ,则按照预期下载index.html 。 但是,如果我从主机运行等效的PowerShell命令Invoke-WebRequest http://localhost:32769 ,则会收到Invoke-WebRequest : The underlying connection was closed: The connection was closed unexpectedly. 下面的全部细节/重放步骤。

Dockerfile

 FROM node MAINTAINER Matthew Pirocchi <matthew.pirocchi@gmail.com> RUN apt-get update && apt-get install -y vim EXPOSE 8080 

容器设置

 docker run -itdP --name repro mpiroc/react-fundamentals docker exec -it repro bash # Following commands executed within container mkdir -p /home/mpiroc/repos && cd /home/mpiroc/repos git clone https://github.com/ReactjsProgram/React-Fundamentals.git cd React-Fundamentals git checkout video2 npm install npm run start # start just runs `webpack-dev-server` 

testing容器

 # In a separate terminal PS C:\Users\matth> docker exec -it repro bash root@fd6c3102bc51:/# wget http://localhost:8080 ... # index.html is downloaded as expected root@fd6c3102bc51:/# exit exit PS C:\Users\matth> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fd6c3102bc51 mpiroc/react-fundamentals "node" 28 minutes ago Up 28 minutes 0.0.0.0:32769->8080/tcp repro PS C:\Users\matth> Invoke-WebRequest http://localhost:32769 Invoke-WebRequest : The underlying connection was closed: The connection was closed unexpectedly. At line:1 char:1 + Invoke-WebRequest http://localhost:32769 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand 

为什么我无法从主机访问发布的端口?

我在这个问题上find了答案。 我需要改变我的npm run start命令:

 "start": "webpack-dev-server" 

 "start": "webpack-dev-server --host 0.0.0.0" 

这是因为在webpack-dev-server 1.8.0及更高版本中,默认情况下, webpack-dev-server只侦听localhost ,而不是在本机(本例中为容器)ip上侦听。

看起来你正在Docker上运行Windows。 如果你使用docker-machine安装,然后做docker-machine ip defaultdocker-machine ip default (你可能需要使用docker-machine ls并使用特定的节点名称而不是默认的)。 然后连接到该IP地址,以覆盖Docker运行的Linux虚拟机,而不是本地主机。 所以,如果你得到:

 docker-machine ip default 192.168.100.1 Invoke-WebRequest http://192.168.100.1:32769 ....