Docker: cannot open port from container to host

2019-06-21 12:40发布

问题:

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.

回答1:

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"
  }


回答2:

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"
  }