Docker:无法打开从容器到主机的端口

时间:2016-11-27 08:53:40

标签: docker dockerfile docker-networking

我正在使用Docker for Mac。我有一个运行服务器的容器,例如我的服务器在端口5000上运行。我在Dockerfile上公开了这个端口

当我的容器运行时,我连接到这个容器并通过运行以下命令检查该服务器是否正常工作,并看到它返回数据(一堆html和javascript)

wget -d localhost:5000

注意,我启动此容器并通过命令在外部发布端口:

docker run -d -p 5000:5000 <docker_image_name>

但是在docker主机(是我的mac并运行El Capitan)时,我打开chrome并转到地址localhost:5000。它不起作用。请注意,如果我去任何任意端口,例如localhost:4000,我会看到来自Chrome的错误消息,例如:

This site can’t be reached
localhost refused to connect.

但是localhost:5000的错误消息是:

The localhost page isn’t working
localhost didn’t send any data.

所以我似乎已经配置了工作&#34;一点点&#34;但有些不对劲。请告诉我如何解决这个问题。

2 个答案:

答案 0 :(得分:6)

请检查容器中的程序是否正在侦听接口0.0.0.0。

在容器中,运行命令:

ss -lntp

如果它看起来像:

LISTEN  0   128   127.0.0.1:5000  *:*

这意味着您的网络应用只能在localhost上收听,因此容器主机无法访问您的网络应用。您应该通过更改您的网络应用构建设置,让您的服务器在0.0.0.0界面收听。

例如,如果您的服务器是nodejs app:

var app = connect().use(connect.static('public')).listen(5000, "0.0.0.0");

如果您的服务器是网络包:

 "scripts": {
    "dev": "webpack-dev-server --host 0.0.0.0 --port 5000 --progress"
  }

答案 1 :(得分:1)

我使用Docker for Mac遇到此问题,试图运行Angular2应用程序。

我通过将package.json更改为

来解决了这个问题
 "scripts": {
    ...
    "start": "ng serve -H 0.0.0.0", # before, this was "start": "ng serve"
  }