Recientemente he estado jugando con Docker y QGIS y he instalado un contenedor siguiendo las instrucciones de este tutorial .
Todo funciona muy bien, aunque no puedo conectarme a una base de datos localhost postgres que contiene todos mis datos SIG. Supongo que esto se debe a que mi base de datos postgres no está configurada para aceptar conexiones remotas y he estado editando los archivos conf de postgres para permitir conexiones remotas utilizando las instrucciones de este artículo .
Todavía recibo un mensaje de error cuando intento conectarme a mi base de datos que ejecuta QGIS en Docker: no se pudo conectar al servidor: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
el servidor postgres se está ejecutando y he editado mi archivo pg_hba.conf para permitir conexiones de un rango de Direcciones IP (172.17.0.0/32). Anteriormente había consultado la dirección IP del contenedor acoplable docker ps
y, aunque la dirección IP cambia, hasta ahora siempre ha estado en el rango 172.17.0.x
¿Alguna idea de por qué no puedo conectarme a esta base de datos? ¡Probablemente algo muy simple, me imagino!
Estoy ejecutando Ubuntu 14.04; Postgres 9.3
fuente
pg_hba.conf
dirección a la que sugirió, pero aún recibo el mismo mensaje de error de conexión después de detener y reiniciar el servicio postgres. Agregué la línea debajo de mis conexiones ipv4. ¿Hay algún otro lugar donde deba agregar la dirección que sugiere? Alternativamente, en mi aplicación QGIS que se ejecuta en Docker, ¿necesito cambiar la información de conexión de Postgres? Por ejemplo, si me conecto desde un contenedor acoplable, ¿el host sigue siendo 'localhost'?localhost
no es el sistema host dentro de su contenedor Docker. Intente conectarse a la dirección IP pública del sistema host. Para mantener el contenedor portátil, también puede iniciar el contenedor con el--add-host=database:<host-ip>
y simplemente usarlodatabase
como nombre de host para conectarse a su host PostgreSQL desde el contenedor Docker./etc/postgresql/9.3/main/postgresql.conf
y agregar laeth0
dirección IP de mi servidorlisten_addresses
. Por defectolisten_addresses
tiene postgres enlazarlocalhost
solo.host-ip
es la dirección IP de la máquina virtual o del contenedor acoplable?Solución Docker para Mac
17.06 en adelante
Gracias al comentario de @Birchlabs, ahora es mucho más fácil con este nombre DNS especial solo para Mac disponible :
Desde 17.12.0-cd-mac46,
docker.for.mac.host.internal
debe usarse en lugar dedocker.for.mac.localhost
. Vea la nota de lanzamiento para más detalles.Versión antigua
La respuesta de @ helmbert explica bien el problema. Pero Docker para Mac no expone la red del puente , así que tuve que hacer este truco para solucionar la limitación:
Abre
/usr/local/var/postgres/pg_hba.conf
y agrega esta línea:Abrir
/usr/local/var/postgres/postgresql.conf
y editar cambioslisten_addresses
:Recargue el servicio e inicie su contenedor:
Lo que hace esta solución es básicamente lo mismo con la respuesta de @ helmbert, pero usa una dirección IP que está conectada en
lo0
lugar dedocker0
la interfaz de red.fuente
docker.for.mac.localhost
. Esta es la IP de su máquina host. busque su entrada en la base de datos de hosts del contenedor de esta manera:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
desde 18.03, otras opciones todavía están disponibles pero en desuso ( Fuente ).Solución simple para mac:
La versión más reciente de docker (18.03) ofrece una solución integrada de reenvío de puertos. Dentro de su contenedor docker, simplemente configure el host db en
host.docker.internal
. Esto se enviará al host en el que se ejecuta el contenedor de Docker.La documentación para esto está aquí: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
fuente
host.docker.internal
limita solo a las Mac?Solución simple
Solo agregue
--network=host
adocker run
. ¡Eso es todo!Este contenedor manera utilizará la red del huésped, por lo que
localhost
y127.0.0.1
apuntará al host (por defecto que apuntan a un recipiente). Ejemplo:fuente
En Ubuntu:
Primero debe verificar que el puerto de la base de datos de Docker esté disponible en su sistema siguiendo el comando:
Salida de muestra:
Aquí
3306
se utiliza como puerto de base de datos Docker en 172.17.0.2 IP, si este puerto no está disponible Ejecute el siguiente comando:Ahora, puede acceder fácilmente a la base de datos de Docker desde su sistema local siguiendo la configuración
En CentOS:
Primero debe verificar si el puerto de la base de datos de Docker está disponible en su firewall siguiendo el comando:
Salida de muestra:
Aquí
3307
se utiliza como puerto de base de datos Docker en 172.17.0.2 IP, si este puerto no está disponible Ejecute el siguiente comando:En el servidor, puede agregar el puerto permanentemente
Ahora, puede acceder fácilmente a la base de datos Docker desde su sistema local mediante la configuración anterior.
fuente
La solución publicada aquí no funciona para mí. Por lo tanto, estoy publicando esta respuesta para ayudar a alguien que enfrenta un problema similar.
SO: Ubuntu 18
PostgreSQL: 9.5 (Alojado en Ubuntu)
Docker: Aplicación de servidor (que se conecta a PostgreSQL)
Estoy usando docker-compose.yml para compilar la aplicación.
PASO 1: agregue
host.docker.internal:<docker0 IP>
Para encontrar la IP de la ventana acoplable
i.e. 172.17.0.1 (in my case)
puede usar:O
PASO 2: en postgresql.conf, cambie listen_addresses a
listen_addresses = '*'
PASO 3: en pg_hba.conf, agregue esta línea
PASO 4: Ahora reinicie el servicio postgresql usando,
sudo service postgresql restart
PASO 5: utilice el
host.docker.internal
nombre de host para conectar la base de datos desde la aplicación del servidor.Ex:
jdbc:postgresql://host.docker.internal:5432/bankDB
¡¡Disfrutar!!
fuente
para docker-compose puedes intentar simplemente agregar
ejemplo:
https://docs.docker.com/compose/compose-file/#network_mode
fuente
Para configurar algo simple que permita una conexión Postgresql desde el contenedor docker a mi host local, utilicé esto en postgresql.conf:
Y agregó este pg_hba.conf:
Luego reinicia. Mi cliente desde el contenedor docker (que estaba en 172.17.0.2) podría conectarse a Postgresql que se ejecuta en mi localhost usando host: contraseña, base de datos, nombre de usuario y contraseña.
fuente
Una cosa más que necesitaba para mi configuración era agregar
a
/etc/hosts
para que Docker apunte
172.17.0.1
como el nombre de host de la base de datos y no confíe en una IP externa cambiante para encontrar la base de datos. ¡Espero que esto ayude a alguien más con este problema!fuente
database
host con--add-host=database:172.17.0.1
cuando se ejecuta el contenedor. Luego, apunte su aplicación a ese host. Esto evita codificar una dirección IP dentro de un contenedor.--add-host=database:172.17.0.1
es preferibleLa otra solución es el volumen de servicio. Puede definir un volumen de servicio y montar el directorio de datos PostgreSQL del host en ese volumen. Echa un vistazo al archivo de composición dado para más detalles.
Al hacer esto, otro servicio PostgreSQL se ejecutará en un contenedor, pero usa el mismo directorio de datos que el servicio host PostgreSQL está usando.
fuente