Suppose you have an Nginx web server running inside an Nginx container in your host machine. And you have a MySQL database running in your host machine. Now, you want to access the MySQL server in your host machine from the Nginx container. Also, the MySQL is running on your localhost and the host machine does not expose any port to the outside world. Hence, we can conclude that MySQL is bound to be run on localhost only and not accessible to the outside world because it is not bound on the IP address.
In this article, we will explain the different ways through which you can access the MySQL running on your localhost or any other program in your host machine from the container.
To sum up in a short discussion, if you are on Docker for Windows or Mac, you can simply connect to MySQL using host.docker.internal instead of 127.0.0.1. If you started your Docker container in your local Linux machine using --add-host host.docker.internal:host-gateway option, you can even use the host.docker.internal string in your connection in your Linux host.
Now, let’s discuss the solutions in detail.
A simple solution to this in a Linux machine is to use the --network=”host” option along with the Docker run command. After that, the localhost (127.0.0.1) in your Docker container will point to the host Linux machine.This runs a Docker container with the settings of the network set to host.
This container will share the network with the host machine and the container’s localhost will point to the host machine. Please note that any port exposed from your Docker container is now opened in your host machine and that too without having to use the publish options.
You can verify this by listing the IP address using the following commands.
In your local machine -
$ ip addr show eth0
And while running the container -
$ docker run -it --network=host ubuntu:latest ip addr show eth0
On executing these commands, you will find that both the container and the host machine have the same IP address and share the same network stack.
If you are using a Mac host, you can use -
HOSTNAME = docker.for.mac.localhost
in your Docker run command. And then you can use -
mysql -uroot -hdocker.for.mac.localhost
inside your Docker container to access MySQL running in your host.
You can also access the MySQL service running in your host machine in your Docker container using the bridge network mode. For that, you need to ensure that the MySQL service is actively listening for all the connections in the 172.17.42.1 address. You can include the bind-address = 172.17.42.1 in your MySQL config file.
In host mode, you can use -
bind-address = 127.0.0.1 in your MySQL config file and then, you can connect to localhost from your containers.
$ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
To sum up, these are the various ways through which you can easily connect to a MySQL service running inside your host machine from a Docker container. In a gist, you can use the --network=host to bind the localhost with your Docker container and they access the MySQL service inside your container using the hostname “127.0.0.1”. Depending on whether you are using a Mac, Windows, or Linux host machine, you can choose the best possible solution that caters to your own requirements.