2016-09-25 144 views
0

我正在通过React.js的教程,并且我决定在Docker容器中工作。 Here是本教程的代码。无法连接到主机的(显示,发布)端口

本教程使用在容器上的端口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 <[email protected]> 
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 
[email protected]:/# wget http://localhost:8080 
... # index.html is downloaded as expected 
[email protected]:/# 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 

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

回答

2

我在this question找到答案。我需要改变我的npm run start命令来自:仅侦听localhost,而不是机器的(在容器

"start": "webpack-dev-server" 

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

这是因为在webpack-dev-server 1.8.0及以上,在默认情况下webpack-dev-server这种情况下)ip。

+1

这是非常有意义的,如果它只在容器中监听本地主机,该端口对于容器外的端口转发将不可见。 – BMitch

0

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

docker-machine ip default 
192.168.100.1 

Invoke-WebRequest http://192.168.100.1:32769 
.... 
+0

我不认为我在使用'docker-machine'。 'docker-machine ls'显示一个空列表。我通过“Docker for Windows”(https://docs.docker.com/engine/installation/windows/)安装了Docker。 –

+0

作为一个健全性检查,如果我运行'docker run -d -p 80:80 --name webserver nginx',并将我的web浏览器指向'localhost:80',我就可以按照预期看到'nginx'欢迎页面。 –

+0

从你的理智测试来看,这可能是带有HyperV的新的1.12安装,避免了过去的ip挑战,所以我上面的回答将不适用。 – BMitch

相关问题