2016-09-25 83 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

相關問題