Accessing host machine from within docker container

Expected behavior

I should have a way to access host machine from within container.

Actual behavior

Cant figure out how to do that with docker for mac beta

Information

With the change to all the docker images running on localhost and the ditching of virtualbox (which from what little I understand, made networking more difficult), I would think there would be a standard way to access the host machine from within the docker container. Is there a way to do this with docker for mac? All the docs regarding doing so seem to only be relevant to the virtual box version and docker-machine

3 Likes

I think i must be missing something here, why does anyone want to access the host machine

if you need to talk to other containers, then you setup a link between,

but why do you need / want to access the root machine, i canā€™t see a purpose for it

In my case, I am running a data visualization app (looker), which needs to whitelist the url of the main application, to allow embedding of iframes under that ip/domain. So in development, the iframes donā€™t resolve, because there is no way for looker to know the ip of the host machine which is running my rails app.

Basically the dependency stack is

Rails
ā€“postgres
ā€“rabbitmq
ā€“looker
----mysql

Links wonā€™t work because I, like many others from what I could gather on these boards, donā€™t want to run the main application (rails) in a docker container, in development. It will only make development/debugging more difficult.

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.

2 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