无法从主机连接到(暴露的、已发布的)端口
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。
我正在学习 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。