我正在学习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 <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为什么我的宿主机无法访问已发布的端口?
发布于 2016-09-25 21:47:09
我在this question中找到了答案。我需要将我的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 (本例中为容器)。
发布于 2016-09-25 20:57:09
看起来你正在运行Docker for 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
....https://stackoverflow.com/questions/39686997
复制相似问题