I have an easy apache docker setup defined in a docker-compose.yml
:
services:
apache:
image: php:7.4-apache
command: /bin/bash -c "/var/www/html/startup.sh && exec 'apache2-foreground'"
volumes:
- ./:/var/www/html
- /c/Windows/System32/drivers/etc/hosts:/tmp/hostsfile
ports:
- "80:80"
From the startup.sh
script I want to modify the hosts
file from the host OS through the volume. Here I want to dynamically add an entry to resolve the hostname test.local
to the ip address of the docker web application like so:
<ip-address> test.local
This way I should be able to open the application with the specified hostname http://test.local
in my local browser.
Before writing the startup.sh
script I wanted to try to manually open the application at http://172.19.0.2
via the containers IP address I got from
docker inspect apache_test
But the page won't open: ERR_CONNECTION_TIMED_OUT
Shouldn't I be able to access the application from that IP? What am I missing? Do I use the wrong IP address?
BTW: I am using Docker Desktop for Windows with the Hyper-V backend
Edit: I am able to access the application via http://localhost
but since I want to add a new entry to the hosts
file this is not the solution.
Apparently in newer versions of Docker Desktop for Windows you can't access (ping) your linux containers by IP.
Now there is some really dirty workaround for this that involves changing a .ps1
file of your Docker installation to get back the DockerNAT
interface on windows. After that you need to add a new route in your windows routing table as described here:
route /P add <container-ip> MASK 255.255.0.0 <ip-found-in-docker-desktop-settings>
Then you might be able to ping your docker container from the windows host. I didn't test it though...
I found a solution to my original issue (resolution of test.local
to container IP via hosts
file) while reading one of the threads linked above here
That involves setting a free loopback IP in the 127.0.0.0/8
IP range in your ports
section of the docker-compose.yml
:
ports:
- "127.55.0.1:80:80"
After that you add the following to your hosts
file:
127.55.0.1 test.local
And you can open your application at http://test.local
To do that for other dockerized applications too just choose another free loopback address.