Docker Tip #35: Connect to a Database Running on Your Docker Host
Once in a while you may want to connect a container to a database or service running on your Docker host. Here's how to do it.
Looking for a more updated version of this post? Check out Docker Tip #65.
I get it, you might not trust Docker well enough to run your database in a container (with a Docker volume to deal with persistence).
Fortunately you can easily have a container connect to any service that’s installed on your Docker host. This means you could install your database / service directly on your Docker host and then connect to it from a running Docker container.
You can simply connect to your local network IP address.
You can figure out your local network IP address by looking for the IP address that belongs to the same subnet as your router (assuming you’re using one). It’s very likely going to be a
Find Your Local Network IP Address on MacOS / Linux:
$ ifconfig eth2 Link encap:Ethernet HWaddr d0:50:99:4a:e8:68 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::c542:1540:8737:c9cd/64 Scope:Global UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ifconfig is unavailable you can also use
Find Your Local Network IP Address on Windows:
$ ipconfig Ethernet adapter vEthernet (External Virtual Network): Connection-specific DNS Suffix . : home Link-local IPv6 Address . . . . . : fe80::c542:1540:8737:c9cd%11 IPv4 Address. . . . . . . . . . . : 192.168.1.3 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.1.1
In my case, my local network IP address is
Testing It Out, Can the Container Reach the Docker Host?
We can test this out without needing to run a database or any service. We’ll just run an Alpine image, drop into a shell, install the ping utility and ping the Docker host.
# Start the Alpine container and drop into a Shell prompt. docker container run --rm -it alpine sh # Install the ping utility. apk update && apk add iputils # Ping your local network IP address (replace my IP address with yours). ping 192.168.1.3 # You should see this output (hit CTRL+C to stop it): PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=37 time=0.539 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=37 time=0.417 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=37 time=0.661 ms
There you have it, you’ve successfully connected to your Docker host over your local network.
If you were running a database, you would use
192.168.1.3 (in my case) as part of your connection string, and then configure your database to bind on
Keep in mind, if you do this, you may want to restrict the outside world from connecting to it because
0.0.0.0 will allow connections from anywhere. Details on how to do this will depend on what database / service you’re using.
But Nick, What If My Local IP Address Changes?
In development this could happen a lot, but in production not so much. In either case the above way will get the job done but there is a cleaner way to do it.
I think it was necessary to show the previous way of doing it because it demonstrates exactly how it works. Now, let’s use a custom Docker network instead.
Create a custom bridge Docker network:
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet
Feel free to change around the IP addresses and
mynet name if you want. In the end, after running this command you’ll be able to access your Docker host by the IP address of
192.168.0.1 regardless of what your real local IP address is.
Confirm it works again, but we’ll use the new network:
# Start the Alpine container, but this time we'll use our custom network. docker container run --rm -it --net=mynet alpine sh # Install the ping utility. apk update && apk add iputils # Ping the custom IP address we set up. ping 192.168.0.1 # You should see this output (hit CTRL+C to stop it): PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.053 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.119 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.062 ms
Ok, so now we have a legit implementation of connecting to your Docker host over a custom network with a static IP address. Nice!
Plot twist: If you decide to run your own database, I would personally use Docker!