Como solucionar errores pocos conocidos en docker, con soluciones algunas muy simples.
Introducción
Comparto algunos problemas que he tenido con docker, problemas que se repiten quizás una vez cada 5 meses y la solución es muy simple, pero no es tan fácil de encontrar en foros.
Docker compose no resuelve dns, nombre de contenedor.
Hace poco necesitaba testear un servicio en mi entorno local, lo de siempre, un backend que se conecta a una db y otros servicios externos, en ese caso estaba usando un asp.net api junto a un mssql, ambos ejecutandose en container separados.
#backend yml
services:
backend:
image: backend-local
container_name: backend
environment:
- DATABASE_URL=Server=autogenerated_name;Database=TestingDb;User Id=SA; Password=${DB_PASS};TrustServerCertificate=True;
networks:
- sql
networks:
sql:
external: true
El container sql es un contendor que levante en mi máquina por defecto según la documentación de mssql, despues de todo es solo para testear en mi máquina local, como notaran el nombre del contenedor usado para el database url fue el nombre generado automáticamente por docker cuando no se le define ningún nombre.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=yourStrong(!)Password" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Lo único que hice entonces fue un docker compose up y no me conectaba a la instancia, me saltaba el error "no se pudo conectar a sql server, timeout, etc.", a primera vista no se encuentra el error, incluso esto ya lo he aplicado en producción y jamás me saltó este error, pero en mi máquina local sí. ¿Pueden localizar el error?
Luego de 3 horas levantando, bajando, cambiando de puerto, verificando que la url la está recibiendo el backend, verificando que la instancia mssql estubiese en la misma network junto con el backend, y nada. En una de esas probé a asignarle la ipv4 del contenedor y sí funcionó, entonces el problema no era la network, solo es que docker no resolvía el dns.
Solución
Al final lo único que hice fue renombrar la instancia mssql, el nombre por defecto se lo quité y le puse un nombre que yo quise, modifiqué entonces el backend yml con el nuevo nombre del contenedor y listo, funcionó.
docker container rename CONTAINER NEW_NAME