I’m currently trying to dockerize my app for local development. For a bit of context, it is using Magento.
I have a configuration file where I’m used to set 127.0.0.1
as MySQL hostname as the web app is running on the same host as MariaDB.
Initially, I’ve tried to link my container within my docker-compose file using ‘links’ (below an extract of my docker-compose setting at this point)
mariadb:
image: mariadb:5.5
php-fpm:
build: docker/php-fpm
links:
- "mariadb:mysql"
At this point, MariaDB was reachable by setting mysql
as hostname in my configuration file instead of 127.0.0.1
. However, I wanted to keep 127.0.0.1
.
After a bit of digging, I’ve found this blog post where it is explained how to set up containers so that it can be reached through localhost
or 127.0.0.1
This is working as I’m expecting but it has a flaw.
Without Docker, I’m able to run PHP scripts which leverage magento core modules by loading it. But with Docker and the blog post configuration, I’m not able to do it anymore as Magento is weirdly expecting for a DB hostname called “mysql”.
Is there anyway through docker-compose to have a container be reachable with localhost
and an hostname?
Without Docker, if I install MariaDB on my host machine, I am able to connect to its instance through 127.0.0.1:3306
or mysql://
. I want to get a similar behaviour.
2
Answers
Yes you can connect through your db with localhost or 127.0.0.1 But this is only possible when you create docker-compose network in host mode.
But when you set your docker network in host mode then containerising concept will fail. So you have to choose host or bridge network mode
You can find networking in docker-compose
As said by @Sai Kumar you can connect the docker containers to the
host
network and then can use localhost to access services. But the problem is the port will be reserved by that container and will not be available till it is deleted.But from your question, the following sentence caught my attention
So If I understand properly Magento is expecting to connect to MySQL with
mysql
as hostname instead oflocalhost
. If so this can be easily solved.How?
So in docker, there is a concept called service discovery. I’ve explained the same in many of my answers. Basically what it does is it resolves IP of containers by container hostname/aliases.So, instead of connecting between containers using IP address you can connect between them by using their hostname such that even if container restarts(which results in change of IP), Docker will take care of resolving it to respective container.
This works only with user-defined networks. So what you can do is create a bridge network and connect both Magento and Mysql to it. and give the
container_name
asmysql
for mysql or you can also use alias as mentioned here. So putting it all together a sample docker compose will beMore references
1. Networking in Compose.
2. Docker Networking.