Docker: cannot open port from container to host

2019-06-21 12:52发布

I'm using Docker for Mac. I have a container that run a server, for example my server is run on port 5000. I have exposed this port on Dockerfile

When my container is running, I connect to this container and check and if this server is working or not by running below command and see that it returns data (a bunch of html and javascript)

wget -d localhost:5000

Notes, I start this container and also publish port outside by command:

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

But at docker host (is my mac and running El Capitan), I open chrome and go to address localhost:5000. It doesn't work. Just a little note, if I go to any arbitrary port such as localhost:4000 I see error message from chrome such as:

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

But error message for localhost:5000 is:

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

So it seems I have configured work "a little" but something wrong. Please tell me how to fix this.

2条回答
虎瘦雄心在
2楼-- · 2019-06-21 13:12

Please check the program in container is listening on interface 0.0.0.0.

In container, run command:

ss -lntp

If it appears like:

LISTEN  0   128   127.0.0.1:5000  *:*

that means your web app only listen at localhost so container host cannot access to your web app. You should make your server listen at 0.0.0.0 interface by changing your web app build setting.

For example if your server is nodejs app:

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

If your server is web pack:

 "scripts": {
    "dev": "webpack-dev-server --host 0.0.0.0 --port 5000 --progress"
  }
查看更多
Evening l夕情丶
3楼-- · 2019-06-21 13:33

I had this problem using Docker for Mac, trying to run an Angular2 app.

I fixed the issue by changing my package.json to

 "scripts": {
    ...
    "start": "ng serve -H 0.0.0.0", # before, this was "start": "ng serve"
  }
查看更多
登录 后发表回答