无法从主机连接到(暴露的、已发布的)端口

Can't connect to (exposed, published) port from host

我正在学习 React.js 的教程,我决定在 Docker 容器中工作。 Here 是教程的代码。

本教程在容器的 8080 端口上使用 webpack-dev-server 运行ning。我已经在我的 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. 完整的 details/repro 步骤。

Docker文件

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`

正在测试容器

# 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

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

看起来您 运行 正在 Docker 上 Windows。如果您使用 docker-machine 安装,则执行 docker-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
....

我在 中找到了答案。我需要更改我的 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。