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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *