Accessing host machine from within docker container

An example would be running an nginx container, which reverse proxies requests back to the host for a web application.

The web application is not in a container because it’s a heavy grails app with multiple dependencies, and will be a container eventually but it’s not currently.

3 Likes

The main problem for me was to reliably find out the IP address of the host. So in order to have a fixed set of IPs for both my host and my containers I’ve set up a docker network like this:

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet

Now each container can connect to the host under the fixed IP 192.168.0.1.

You just need to make sure, that you connect all your containers to that “dockernet” network you just created. You can do that with the --net=dockernet option for docker run. Or from a docker-compose.yml:

version: '2'
services:
    db:
        image: some/image
        networks:
            - dockernet
networks:
    dockernet:
        external: true

Networks are described in the network documentation. They are quite useful and not very hard to understand.

6 Likes

It will be possible to ping host by gateway ip, but curl gateway-ip-addr still does not work in container.

Another example would be running a php application that has xdebug set up on it. In order to debug, the server must connect to the ide with an ip address that is defined in the configuration. At the moment, I have to hardcode the ip address of the host machine into that configuration file.

5 Likes

I’m having a similar issue: can ping the host, yet can not curl any data from the host.

I recently created a repo to address the host<->container connectivity issues in Docker for Mac. It’s not an ideal solution by any stretch (it’s very much a hack), but it does suffice for local development. It does have limitations; it only supports a single named host network right now, and must be re-run each time the Docker daemon is restarted (check the Readme). When used in it’s default configuration running ifconfig on your host machine should reveal a new tap1 interface, the IP reported there may be used inside containers connected to named bridge network to access the host machine.

I have the same issue. With solution by @mikehaertl I can ping the host, but I can’t curl.
Any suggestion to make it work?

Try connecting the container to the ‘host’ network.
e.g. –

docker run --network host ...

Run this from within the container to get the IP of the host:

route | awk '/^default/ { print $2 }'
3 Likes

In case if you just want to reach your host machine as ‘localhost’ add the following option to docker run

docker run --add-host="localhost:192.168.65.1"

In my case 192.168.65.1 is always the IP to the host ( output of : route | awk '/^default/ { print $2 }' )

6 Likes

Not a helpful question at all. I am trying to do the same thing as original poster.

Building on @mikehaertl’s response, on OSX, I was able to add an alias for my loopback adapter:

sudo ifconfig lo0 alias 172.16.222.111

Then in docker run, I used:

--add-host my.private.dnsname.com:172.16.222.111

This workaround enables docker-to-localhost connectivity on OSX’s docker as of 17.06.

2 Likes

You can now do this with docker for mac with docker.for.mac.localhost

from Docker for Mac release notes

Add an experimental DNS name for the host: docker.for.mac.localhost

In my nginx.conf I could reach localhost:8090 on the host machine from within a Docker container with

proxy_pass http://docker.for.mac.localhost:8090/app;
13 Likes

There’s also docker.for.win.localhost for Docker for Windows users.

What I’d really like though is a method to do this cross-platform - We have Linux and Windows users that use the same docker-compose.yaml - docker.for.win.localhost will mean nothing to half of them. Any suggestions?

4 Likes

Exactly, so far I am not able to achieve what seems an easy task. The goal beeing avoinding to put the ip in the image.

i would use the --add_host parm when u start the container

no network nor hosts are needed. As @rohaq and @kevinpmcc mentioned,

for windows : docker.for.win.localhost
for mac : docker.for.mac.localhost

It works like a charm for me.

Thanks @rohaq and @kevinpmcc !

2 Likes

What if your docker works with linux?

Docker Container to access host ports => https://github.com/qoomon/docker-host.

This worked ! Thank you