0007 Mixing networks in Docker Compose
Turns out Docker Compose is pretty lazy and rigid when dealing with networks.
If you create a Docker container and join it to a bridge (default) network, the container's ID and name will resolve to the container's IP address in Docker's internal DNS server.
On top of that, Docker Compose will add the service name to the DNS server. No matter what. hostname
doesn't replace the service name, just adds another name that resolves to the same thing. I can point you to the exact line in the code.
All these DNS names are added to every network the container joins, and you can't prevent that.
And that makes a funny scenario if you're trying to connect two projects. Imagine a escenario with these services:
- Project
alpha
web
: calls toapi
api
: calls todb
andbeta
'sapi
db
- Project
beta
api
: calls todb
db
If you connect beta
's api
service to alpha
's network and alpha
's web
makes a request to api
, who will respond? Well, both api
s from alpha
and beta
are registered at the DNS name api
.
To prevent any problems, you would need to create a new network, include both api
s to it with aliases like alpha.api
and beta.api
and make sure that alpha
's api
is doing requests to the name beta.api
, so it doesn't potentially call to itself. This way, you need to be aware of the potential name collissions in just one service, not many.
In summary: To connect two services from two different projects, create a third network and join just these two services, or confusing shit will happen.