J'ai récemment joué avec Docker et QGIS et j'ai installé un conteneur en suivant les instructions de ce tutoriel .
Tout fonctionne très bien, bien que je ne puisse pas me connecter à une base de données postgres localhost qui contient toutes mes données SIG. Je suppose que cela est dû au fait que ma base de données postgres n'est pas configurée pour accepter les connexions à distance et que j'ai modifié les fichiers conf postgres pour autoriser les connexions à distance à l'aide des instructions de cet article .
Je reçois toujours un message d'erreur lorsque j'essaye de me connecter à ma base de données exécutant QGIS dans Docker: impossible de se connecter au serveur: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
le serveur postgres est en cours d'exécution et j'ai modifié mon fichier pg_hba.conf pour permettre les connexions à partir d'une plage de Adresses IP (172.17.0.0/32). J'avais précédemment interrogé l'adresse IP du conteneur docker en utilisant docker ps
et bien que l'adresse IP change, elle a jusqu'à présent toujours été dans la plage 172.17.0.x
Des idées pourquoi je ne peux pas me connecter à cette base de données? Probablement quelque chose de très simple j'imagine!
J'utilise Ubuntu 14.04; Postgres 9.3
la source
pg_hba.conf
à l'adresse que vous avez suggérée, mais je reçois toujours le même message d'erreur de connexion après l'arrêt et le redémarrage du service postgres. J'ai ajouté la ligne sous mes connexions ipv4 - y a-t-il un autre endroit où je suis censé ajouter l'adresse que vous suggérez? Sinon, dans mon application QGIS exécutée dans Docker, dois-je modifier les informations de connexion postgres? Par exemple, si je me connecte depuis un conteneur docker, l'hôte est-il toujours «localhost»?localhost
le système hôte n'est pas à l'intérieur de votre conteneur Docker. Essayez de vous connecter à l'adresse IP publique du système hôte. Pour garder le conteneur portable, vous pouvez également démarrer le conteneur avec le--add-host=database:<host-ip>
et simplement l'utiliserdatabase
comme nom d'hôte pour vous connecter à votre hôte PostgreSQL à partir du conteneur Docker./etc/postgresql/9.3/main/postgresql.conf
et ajouter l'eth0
adresse IP de mon serveurlisten_addresses
. Par défaut,listen_addresses
postgres est liélocalhost
uniquement à.host-ip
est l'adresse IP de la machine virtuelle ou du conteneur docker?Solution Docker pour Mac
À partir du 17.06
Grâce au commentaire de @Birchlabs, c'est maintenant beaucoup plus facile avec ce nom DNS spécial disponible uniquement pour Mac :
Depuis 17.12.0-cd-mac46,
docker.for.mac.host.internal
doit être utilisé à la place dedocker.for.mac.localhost
. Voir la note de publication pour plus de détails.Ancienne version
La réponse de @ helmbert explique bien le problème. Mais Docker pour Mac n'expose pas le réseau de pont , j'ai donc dû faire cette astuce pour contourner la limitation:
Ouvrez
/usr/local/var/postgres/pg_hba.conf
et ajoutez cette ligne:Ouvrir
/usr/local/var/postgres/postgresql.conf
et modifier les modificationslisten_addresses
:Rechargez le service et lancez votre conteneur:
Ce que cette solution de contournement fait est fondamentalement la même chose avec la réponse de @ helmbert, mais utilise une adresse IP qui est attachée à la
lo0
place de l'docker0
interface réseau.la source
docker.for.mac.localhost
. c'est l'adresse IP de votre machine hôte. recherchez son entrée dans la base de données des hôtes du conteneur comme ceci:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
depuis 18.03, d'autres options sont toujours disponibles mais obsolètes ( Source ).Solution simple pour Mac:
La dernière version de docker (18.03) offre une solution de transfert de port intégrée. À l'intérieur de votre conteneur Docker, définissez simplement l'hôte db sur
host.docker.internal
. Celui-ci sera transmis à l'hôte sur lequel le conteneur Docker s'exécute.La documentation pour cela est ici: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
la source
host.docker.internal
limité aux macs uniquement?Solution simple
Ajoutez simplement
--network=host
àdocker run
. C'est tout!De cette façon, le conteneur utilisera le réseau de l'hôte, donc
localhost
et127.0.0.1
pointera vers l'hôte (par défaut, il pointe vers un conteneur). Exemple:la source
Dans Ubuntu:
Vous devez d'abord vérifier que le port de la base de données Docker est disponible dans votre système en suivant la commande -
Exemple de SORTIE:
Ici
3306
est utilisé comme port de base de données Docker sur IP 172.17.0.2, si ce port n'est pas disponible Exécutez la commande suivante -Maintenant, vous pouvez facilement accéder à la base de données Docker à partir de votre système local en suivant la configuration
Dans CentOS:
Vous devez d'abord vérifier que le port de la base de données Docker est disponible dans votre pare-feu en suivant la commande -
Exemple de SORTIE:
Ici
3307
est utilisé comme port de base de données Docker sur IP 172.17.0.2, si ce port n'est pas disponible Exécutez la commande suivante -Dans le serveur, vous pouvez ajouter le port en permanence
Maintenant, vous pouvez facilement accéder à la base de données Docker à partir de votre système local grâce à la configuration ci-dessus.
la source
La solution affichée ici ne fonctionne pas pour moi. Par conséquent, je publie cette réponse pour aider quelqu'un confronté à un problème similaire.
OS: Ubuntu 18
PostgreSQL: 9.5 (hébergé sur Ubuntu)
Docker: Application serveur (qui se connecte à PostgreSQL)
J'utilise docker-compose.yml pour créer une application.
ÉTAPE 1: Veuillez ajouter
host.docker.internal:<docker0 IP>
Pour trouver l'adresse IP du docker,
i.e. 172.17.0.1 (in my case)
vous pouvez utiliser:OU
ÉTAPE 2: Dans postgresql.conf, remplacez listen_addresses par
listen_addresses = '*'
ÉTAPE 3: Dans pg_hba.conf, ajoutez cette ligne
ÉTAPE 4: Maintenant, redémarrez le service postgresql en utilisant,
sudo service postgresql restart
ÉTAPE 5: Veuillez utiliser le
host.docker.internal
nom d'hôte pour connecter la base de données à partir de l'application serveur.Ex:
jdbc:postgresql://host.docker.internal:5432/bankDB
Prendre plaisir!!
la source
pour docker-compose, vous pouvez essayer d'ajouter simplement
exemple :
https://docs.docker.com/compose/compose-file/#network_mode
la source
Pour configurer quelque chose de simple qui permet une connexion Postgresql du conteneur docker à mon hôte local, j'ai utilisé ceci dans postgresql.conf:
Et a ajouté ce pg_hba.conf:
Faites ensuite un redémarrage. Mon client du conteneur docker (qui était à 172.17.0.2) pouvait alors se connecter à Postgresql en cours d'exécution sur mon hôte local en utilisant l'hôte: mot de passe, base de données, nom d'utilisateur et mot de passe.
la source
Une autre chose nécessaire pour ma configuration était d'ajouter
à
/etc/hosts
de sorte que Docker pointe
172.17.0.1
comme le nom d'hôte de la base de données et ne se fie pas à une adresse IP externe changeante pour trouver la base de données. J'espère que cela aide quelqu'un d'autre avec ce problème!la source
database
hôte avec--add-host=database:172.17.0.1
lors de l'exécution du conteneur. Puis pointez votre application vers cet hôte. Cela évite de coder en dur une adresse IP à l'intérieur d'un conteneur.--add-host=database:172.17.0.1
est préférableL'autre solution est le volume de service. Vous pouvez définir un volume de service et monter le répertoire de données PostgreSQL de l'hôte dans ce volume. Consultez le fichier de composition donné pour plus de détails.
En faisant cela, un autre service PostgreSQL fonctionnera sous le conteneur mais utilisera le même répertoire de données que celui utilisé par le service PostgreSQL hôte.
la source