Acceder desde contenedor Docker a servicios de la misma máquina

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:

En el punto 5 “docker0” vemos que la red usada por Docker es la 172.17.0.1/16. Accederemos al fichero de configuración de Postgres para habilitar el acceso desde este rango de red. Para ello:

$ 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.