Si eres usuario habitual de Docker te habrás dado cuenta que si arrancas un contenedor en una máquina y usas «localhost» para acceder a otros servicios del servidor, simplemente no funciona.
Esto se debe a que nuestro contenedor Docker no está en la misma red por lo que es importante hacer algunos cambios. Supongamos que tienes un contenedor Docker con una aplicación funcionando en Django, y quieres conectar a una base de datos PostgreSQL que está instalado de forma nativa en el mismo servidor donde estás arrancando tu aplicación.
Cuando haces una conexión a la base de datos, habiendo indicado localhost en la configuración del host, te dice que la base de datos no está disponible y compruebes si el servidor está aceptando peticiones en el puerto 5432.
La forma de resolver esto es usando el parámetro siguiente al ejecutar docker run:
--network=host
De esta forma ahora desde dentro de un contenedor tendrás capacidad para acceder a cualquier servicio de la máquina anfitrión
Configuración para acceder a PostgreSQL
Si la conexión has de hacerla a una base de datos de Postgres, necesitarás hacer unos pasos adicionales.
Será necesario acceder al fichero de configuración de postgres y añadir el rango de IP propios de Docker. Si estás usando una distribución Linux puedes usar:
$ ip a
La respuesta será similar a lo siguiente:
$ sudo nano /etc/postgresql/14/main/pg_hba.conf
En este caso estamos usando la versión 14 pero deberás cambiarla por la que tengas instalada. En «IPv4 local connections» agregaremos la siguiente línea:
host all all 172.17.0.1/16 md5
Recuerda reiniciar el servidor:
$ sudo systemctl restart postgresql
Y ¡listo! ya tenemos configurada nuestra base de datos para aceptar peticiones hechas por nuestras aplicaciones dockerizadas.