There are situations where from a Docker container, you need to access services on the host machine. An example of this use-case is trying to test pdf-generation using a website hosted in your IDE environment from a container running on the same host pdf-bot.
Summary
From Docker 18.04 on-wards there is a convenient internal DNS Entry (host.docker.internal
) accessible from your containers that will resolve to the internal network address of your host from your Docker container’s network.
You can ping the host from within a container by running
ping host.docker.internal
Proof
To test this feature using this guide you will need
- Docker 18.03+ installed
- Internet Access
Steps
Step 1: Run the Docker container using the command
docker run -t -d ubuntu
This will return you the container id, in my case it is a77209ae9b0f11c80ce488eda8631a03e8444af94167fd6a96df5ee2e600da1f
Step 2. Access the container by running
docker exec -it <container id> /bin/bash
e.g. docker exec -it a77 /bin/bash
.
Note: you do not need to use full container id, you can use first 3 characters
Step 3. Set up the container
From within the container run the following commands:
Get package lists – apt-get update
Install net-tools – apt-get install net-tools
Install DNS utilities – apt-get install dnsutils
Install iputils-ping –apt-get install iputils-ping
Step 4. Using the DNS Service
There is a dns service running on the containers network default gateway (eth01) that allows you to resolve to the internal IP address used by the host. The DNS name to resolve the host is host.docker.internal
.
Step 5. Pinging the host
Ping the host to establish that you have connectivity. You will also be able to see the host IP Address that is resolved.
ping host.docker.internal
note: you should use this internal DNS address instead of IP as the IP address of the host may change.
- Accessing other services on the host
Services on the host should be advertising on either 0.0.0.0 or localhost to be accessible.
e.g. To access a service on the host running on localhost:4200 you can run the following command from within the host.
curl 192.168.65.2:4200
Note that if you use host.docker.internal
some web servers will throw "Invalid Host header" errors in which case you either need to disable host header check on your web server or use the IP Address instead of the host name