Ich habe kürzlich mit Docker und QGIS herumgespielt und einen Container installiert, der den Anweisungen in diesem Tutorial folgt .
Alles funktioniert hervorragend, obwohl ich keine Verbindung zu einer localhost-Postgres-Datenbank herstellen kann, die alle meine GIS-Daten enthält. Ich denke, dies liegt daran, dass meine Postgres-Datenbank nicht für die Annahme von Remoteverbindungen konfiguriert ist und die Postgres-Conf-Dateien so bearbeitet hat, dass Remoteverbindungen gemäß den Anweisungen in diesem Artikel zugelassen werden .
Ich erhalte immer noch eine Fehlermeldung, wenn ich versuche, eine Verbindung zu meiner Datenbank Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
herzustellen , auf der QGIS in Docker ausgeführt wird: Es konnte keine Verbindung zum Server hergestellt werden: Der Postgres-Server wird ausgeführt, und ich habe meine Datei pg_hba.conf bearbeitet , um Verbindungen aus einer Reihe von Bereichen zuzulassen IP-Adressen (172.17.0.0/32). Ich hatte zuvor die IP-Adresse des Docker-Containers mit abgefragt docker ps
und obwohl sich die IP-Adresse ändert, lag sie bisher immer im Bereich 172.17.0.x.
Irgendwelche Ideen, warum ich keine Verbindung zu dieser Datenbank herstellen kann? Wahrscheinlich etwas sehr Einfaches, das ich mir vorstelle!
Ich verwende Ubuntu 14.04. Postgres 9.3
quelle
pg_hba.conf
Adresse in die von Ihnen vorgeschlagene Adresse geändert , erhalte jedoch nach dem Stoppen und Neustarten des Postgres-Dienstes immer noch dieselbe Verbindungsfehlermeldung. Ich habe die Zeile unter meinen IPv4-Verbindungen hinzugefügt. Gibt es irgendwo anders, wo ich die von Ihnen vorgeschlagene Adresse hinzufügen soll? Muss ich in meiner QGIS-App, die in Docker ausgeführt wird, alternativ die Postgres-Verbindungsinformationen ändern? Wenn ich beispielsweise eine Verbindung innerhalb eines Docker-Containers herstelle, ist der Host dann immer noch "localhost"?localhost
befindet sich nicht das Hostsystem in Ihrem Docker-Container? Versuchen Sie, eine Verbindung zur öffentlichen IP-Adresse des Hostsystems herzustellen. Um den Container portabel zu halten, können Sie den Container auch mit dem starten--add-host=database:<host-ip>
und einfachdatabase
als Hostname verwenden, um über den Docker-Container eine Verbindung zu Ihrem PostgreSQL-Host herzustellen./etc/postgresql/9.3/main/postgresql.conf
dieeth0
IP-Adresse meines Servers bearbeiten und hinzufügenlisten_addresses
. Standardmäßig werdenlisten_addresses
nur Postgres gebundenlocalhost
.host-ip
ist die IP-Adresse der virtuellen Maschine oder des Docker-Containers?Docker für Mac-Lösung
Ab 17.06
Dank des Kommentars von @Birchlabs ist es jetzt viel einfacher, diesen speziellen DNS-Namen nur für Mac zu verwenden :
Ab 17.12.0-cd-mac46
docker.for.mac.host.internal
sollte statt verwendet werdendocker.for.mac.localhost
. Siehe Versionshinweis für Details.Ältere Version
@ helmberts Antwort erklärt das Problem gut. Da Docker für Mac das Bridge-Netzwerk jedoch nicht verfügbar macht , musste ich diesen Trick ausführen, um die Einschränkung zu umgehen:
Öffnen
/usr/local/var/postgres/pg_hba.conf
Sie diese Zeile und fügen Sie sie hinzu:/usr/local/var/postgres/postgresql.conf
Änderung öffnen und bearbeitenlisten_addresses
:Laden Sie den Dienst neu und starten Sie Ihren Container:
Diese Problemumgehung entspricht im Wesentlichen der Antwort von @ helmbert, verwendet jedoch eine IP-Adresse, die
lo0
anstelle derdocker0
Netzwerkschnittstelle angehängt ist .quelle
docker.for.mac.localhost
. Dies ist die IP Ihres Host-Computers. Suchen Sie den Eintrag in der Hosts-Datenbank des Containers wiedocker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
seit dem 18.03. Geändert. Andere Optionen sind noch verfügbar, aber veraltet ( Quelle ).Einfache Lösung für Mac:
Die neueste Version von Docker (18.03) bietet eine integrierte Portweiterleitungslösung. Stellen Sie in Ihrem Docker-Container einfach den Datenbank-Host auf ein
host.docker.internal
. Dies wird an den Host weitergeleitet, auf dem der Docker-Container ausgeführt wird.Die Dokumentation hierzu finden Sie hier: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
quelle
host.docker.internal
nur auf Macs beschränkt?Einfache Lösung
Fügen Sie einfach
--network=host
zudocker run
. Das ist alles!Auf diese Weise verwendet der Container das Netzwerk des Hosts
localhost
und127.0.0.1
zeigt auf den Host (standardmäßig zeigen sie auf einen Container). Beispiel:quelle
In Ubuntu:
Zuerst müssen Sie überprüfen, ob der Docker-Datenbankport in Ihrem System verfügbar ist, indem Sie den folgenden Befehl ausführen:
Beispielausgabe:
Hier
3306
wird als Docker-Datenbankport auf IP 172.17.0.2 verwendet. Wenn dieser Port nicht verfügbar ist Führen Sie den folgenden Befehl aus:Jetzt können Sie von Ihrem lokalen System aus problemlos auf die Docker-Datenbank zugreifen, indem Sie die folgende Konfiguration durchführen
In CentOS:
Zuerst müssen Sie überprüfen, ob der Docker-Datenbankport in Ihrer Firewall verfügbar ist, indem Sie den folgenden Befehl ausführen:
Beispielausgabe:
Hier
3307
wird als Docker-Datenbankport auf IP 172.17.0.2 verwendet. Wenn dieser Port nicht verfügbar ist Führen Sie den folgenden Befehl aus:Auf dem Server können Sie den Port dauerhaft hinzufügen
Mit der obigen Konfiguration können Sie jetzt problemlos von Ihrem lokalen System aus auf die Docker-Datenbank zugreifen.
quelle
Die hier veröffentlichte Lösung funktioniert bei mir nicht. Daher poste ich diese Antwort, um jemandem zu helfen, der mit einem ähnlichen Problem konfrontiert ist.
Betriebssystem: Ubuntu 18
PostgreSQL: 9.5 (gehostet unter Ubuntu)
Docker: Serveranwendung (die eine Verbindung zu PostgreSQL herstellt)
Ich verwende docker-compose.yml, um eine Anwendung zu erstellen.
SCHRITT 1: Bitte hinzufügen
host.docker.internal:<docker0 IP>
Um die IP des Dockers zu finden
i.e. 172.17.0.1 (in my case)
, können Sie Folgendes verwenden:ODER
SCHRITT 2: Ändern Sie in postgresql.conf listen_addresses in
listen_addresses = '*'
SCHRITT 3: Fügen Sie in pg_hba.conf diese Zeile hinzu
SCHRITT 4: Starten Sie nun den postgresql-Dienst neu mit:
sudo service postgresql restart
SCHRITT 5: Verwenden Sie den
host.docker.internal
Hostnamen, um die Datenbank über die Serveranwendung zu verbinden.Ex:
jdbc:postgresql://host.docker.internal:5432/bankDB
Genießen!!
quelle
Für Docker-Compose können Sie versuchen, einfach hinzuzufügen
Beispiel:
https://docs.docker.com/compose/compose-file/#network_mode
quelle
Um etwas Einfaches einzurichten, das eine Postgresql-Verbindung vom Docker-Container zu meinem lokalen Host ermöglicht , habe ich dies in postgresql.conf verwendet:
Und fügte diese pg_hba.conf hinzu:
Führen Sie dann einen Neustart durch. Mein Client aus dem Docker-Container (Stand 172.17.0.2) konnte dann eine Verbindung zu Postgresql herstellen, das auf meinem lokalen Host ausgeführt wird, und zwar unter Verwendung des Hosts: Kennwort, Datenbank, Benutzername und Kennwort.
quelle
Eine weitere Sache, die für mein Setup benötigt wurde, war das Hinzufügen
zu
/etc/hosts
Damit Docker auf
172.17.0.1
den DB-Hostnamen verweist und sich nicht auf eine sich ändernde äußere IP-Adresse verlässt, um die DB zu finden. Hoffe das hilft jemand anderem bei diesem Problem!quelle
database
Host einzurichten--add-host=database:172.17.0.1
. Zeigen Sie dann mit Ihrer App auf diesen Host. Dadurch wird vermieden, dass eine IP-Adresse in einem Container fest codiert wird.--add-host=database:172.17.0.1
ist vorzuziehenDie andere Lösung ist das Service-Volume. Sie können ein Service-Volume definieren und das PostgreSQL-Datenverzeichnis des Hosts in dieses Volume einbinden. Überprüfen Sie die angegebene Erstellungsdatei für Details.
Auf diese Weise wird ein anderer PostgreSQL-Dienst unter Container ausgeführt, verwendet jedoch dasselbe Datenverzeichnis, das der PostgreSQL-Host-Dienst verwendet.
quelle