How to access Docker container's web server from host

I'm running under boot2docker 1.3.1.

I have a Docker container running a web server via uwsgi --http :8080.

If I attach to the container I can browse the web site using lynx http://127.0.0.1:8080 so I know the server is working.

I ran my container with:

$ docker run -itP --expose 8080 uwsgi_app:0.2

It has the following details:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5248ad86596d        uwsgi_app:0.2     "bash"              11 minutes ago      Up 11 minutes       0.0.0.0:49159->8080/tcp   cocky_hypatia
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d
172.17.0.107

I thought I could access that web site from my host by going to http://172.17.0.107:49159.

This does not work. I just see 'connecting...' in Chrome, getting nowhere.

What am I doing wrong?


Extending Anentropic's answer: boot2docker is the old app for Mac and Windows, docker-machine is the new one.

Firstly, list your machines:

$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

Then select one of the machines (the default one is called default) and:

$ docker-machine ip default

192.168.99.100

Ok, stupid me, I found the answer in the docs for boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

I needed to use the ip address of the boot2docker vm, rather than the ip of the container, i.e.

$ boot2docker ip
192.168.59.103

and I am able to browse my site from the host at http://192.168.59.103:49159/

I did not need to add any route on the host


To find the IP address of your container, you should need NO additional installs:

docker inspect <container>

This provides a wealth of info. grep it for the IPAddress.


You could use boot2docker port mapping option -L, as described here.

So, in your case it would be

boot2docker ssh -L 0.0.0.0:8080:localhost:8080

and then

docker run -it -p 8080:8080 uwsgi_app:0.2

That way, you do not have to use boot2docker's IP address: you can use localhost or your own IP address (and your docker container can be accessed from outside).