无法连接到主机的(显示,发布)端口
我正在通过一个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 default
的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 ....