How to access host port from docker container
For all platforms
Docker v 20.10 and above (since December 14th 2020)
On Linux, add --add-host=host.docker.internal:host-gateway
to your Docker command to enable this feature. (See below for Docker Compose configuration.)
Use your internal IP address or connect to the special DNS name host.docker.internal
which will resolve to the internal IP address used by the host.
To enable this in Docker Compose on Linux, add the following lines to the container definition:
extra_hosts:- "host.docker.internal:host-gateway"
For macOS and Windows
Docker v 18.03 and above (since March 21st 2018)
Use your internal IP address or connect to the special DNS name host.docker.internal
which will resolve to the internal IP address used by the host.
Linux support pending https://github.com/docker/for-linux/issues/264
MacOS with earlier versions of Docker
Docker for Mac v 17.12 to v 18.02
Same as above but use docker.for.mac.host.internal
instead.
Docker for Mac v 17.06 to v 17.11
Same as above but use docker.for.mac.localhost
instead.
Docker for Mac 17.05 and below
To access host machine from the docker container you must attach an IP alias to your network interface. You can bind whichever IP you want, just make sure you're not using it to anything else.
sudo ifconfig lo0 alias 123.123.123.123/24
Then make sure that you server is listening to the IP mentioned above or 0.0.0.0
. If it's listening on localhost 127.0.0.1
it will not accept the connection.
Then just point your docker container to this IP and you can access the host machine!
To test you can run something like curl -X GET 123.123.123.123:3000
inside the container.
The alias will reset on every reboot so create a start-up script if necessary.
Solution and more documentation here: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
When running Docker natively on Linux, you can access host services using the IP address of the docker0
interface. From inside the container, this will be your default route.
For example, on my system:
$ ip addr show docker07: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link valid_lft forever preferred_lft forever
And inside a container:
# ip route showdefault via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 src 172.17.0.4
It's fairly easy to extract this IP address using a simple shellscript:
#!/bin/shhostip=$(ip route show | awk '/default/ {print $3}')echo $hostip
You may need to modify the iptables
rules on your host to permitconnections from Docker containers. Something like this will do thetrick:
# iptables -A INPUT -i docker0 -j ACCEPT
This would permit access to any ports on the host from Dockercontainers. Note that:
iptables rules are ordered, and this rule may or may not do theright thing depending on what other rules come before it.
you will only be able to access host services that are either (a)listening on
INADDR_ANY
(aka 0.0.0.0) or that are explicitlylistening on thedocker0
interface.
If you are using Docker on MacOS or Windows 18.03+, you can connect to the magic hostname host.docker.internal
.
Lastly, under Linux you can run your container in the host network namespace by setting --net=host
; in this case localhost
on your host is the same as localhost
inside the container, so containerized service will act like non-containerized services and will be accessible without any additional configuration.
Use --net="host"
in your docker run
command, then localhost
in your docker container will point to your docker host.