Verbindung zu Postgresql in einem Docker-Container von außen

197

Ich habe Postgresql auf einem Server in einem Docker-Container. Wie kann ich von außen, dh von meinem lokalen Computer aus, eine Verbindung herstellen? Welche Einstellung sollte ich anwenden, um dies zuzulassen?

Sojo
quelle
1
Mit welchem ​​Befehl haben Sie die postresql gestartet? Sie können einen Hafen
freigeben
Lesen
craftsmannadeem

Antworten:

313

Sie können Postgres folgendermaßen ausführen (einen Port zuordnen):

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Jetzt haben Sie den Port 5432 Ihres Containers dem Port 5432 Ihres Servers zugeordnet. -p <host_port>:<container_port> So ist jetzt Ihr Postgres von Ihrem zugänglichpublic-server-ip:5432

So testen Sie: Führen Sie die Postgres-Datenbank aus (Befehl oben).

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

Gehen Sie in Ihren Container und erstellen Sie eine Datenbank:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Gehen Sie zu Ihrem lokalen Host (wo Sie ein Tool oder den psql-Client haben).

psql -h public-ip-server -p 5432 -U postgres

(Passwort mysecretpassword)

postgres=# \l

                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

Sie greifen also von Ihrem lokalen Host auf die Datenbank zu (die im Docker auf einem Server ausgeführt wird).

In diesem Beitrag wird es im Detail erklärt.

lvthillo
quelle
1
@Tjorriemorrie Bist du sicher, dass dein Postgres auf deinem lokalen Computer läuft? Vielleicht versuchen Sie 127.0.0.1 anstelle von localhost, aber für erfüllt funktioniert es.
lvthillo
2
Holen Sie sich Ihre öffentliche IP-Adresse (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul
4
Von all den verschiedenen Postgres / Docker-bezogenen Posts, die ich gefunden habe, ist dies einer der nützlichsten. Danke dir.
rg88
1
@GarouDan Wenn Sie keinen Port zuordnen möchten, aber dennoch von Ihrem Host aus auf den Postgres-Container zugreifen möchten, müssen Sie Ihren Container wie docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
folgt
1
Das Beenden von psql funktioniert mit \ q (nur für Neulinge wie mich)
Dirk Schumacher
39

Ich habe es geschafft, es unter Linux zum Laufen zu bringen

  1. Führen Sie die Docker-Postgres aus - stellen Sie sicher, dass der Port veröffentlicht ist. Ich verwende Alpine, weil er leicht ist.

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. Greifen Sie mit einem anderen Terminal vom Host aus mit dem postgres uri auf die Datenbank zu

    psql postgresql://postgres:1234@localhost:5432/postgres

Ersetzen Sie für Mac-Benutzer psql durch pgcli

Thomas Webber
quelle
7
froh, dass jemand geantwortet hat, wie man eine Verbindung herstellt, ohne in den Container zu springen. Danke.
PabTorre
1
Sie sollten sudoIhren Container wirklich nicht zum Ausführen verwenden.
Russ Bateman
28

Sie können auch über den Docker Exec-Befehl auf Folgendes zugreifen:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Oder

$ docker exec -it postgres-container psql -U postgres
SuperNova
quelle
3
psql -U postgres
Maryna Krasnova
Das ist ein überraschend nützlicher Kommentar
Dan Rosenstark
Was macht su postgresdas
Breno
14

Ich hatte bereits Postgres auf dem Host-Computer ausgeführt und wollte keine Verbindungen vom Netzwerk zulassen. Daher habe ich eine temporäre Postgres-Instanz im Container ausgeführt und die Datenbank in nur zwei Zeilen erstellt:

# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres

# Create database
docker exec -it postgres-container createdb -U postgres my-db
Eugene
quelle
Wenn Sie eine einzelne Standarddatenbank erstellen möchten, können Sie auch -e POSTGRES_DB=my-dbFolgendes hinzufügen: my-db anstelle von postgres erstellen
framp
13

Ich benutze Django mit Postgres in Docker-Containern. Fügen Sie in der Docker-Compose-Datei Folgendes hinzu:

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

Dadurch wird der zugängliche Port Ihres lokalen Computers hinzugefügt. Für mich selbst habe ich DBeaver damit verbunden. Dadurch werden Portkonflikte zwischen Ihrer App-Anforderung und der lokalen Computeranforderung verhindert. Zuerst erhielt ich die Nachricht, dass der Port 5432 verwendet wird (der von der Django-App stammt), sodass ich nicht über pgAdmin oder DBeaver darauf zugreifen konnte.

Omeraiman
quelle
1
Ich fand das am hilfreichsten. Für Leute, die Docker-Compose verwenden, scheint dies der beste Weg zu sein.
David Frick
Danke David, viel Spaß beim Codieren!
Omeraiman
9

Um eine Verbindung vom lokalen Host herzustellen, müssen Sie '--net host' hinzufügen:

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Sie können direkt auf den Server zugreifen, ohne exec von Ihrem lokalen Host aus zu verwenden. Verwenden Sie dazu:

psql -h localhost -p 5432 -U postgres
user2627846
quelle
6

Ich habe versucht, eine Verbindung von localhost (mac) zu einem Postgres-Container herzustellen. Ich habe den Port in der Docker-Compose-Datei von 5432 auf 3306 geändert und den Container gestartet. Keine Ahnung warum ich es getan habe: |

Dann habe ich versucht, über PSequel und adminer eine Verbindung zu postgres herzustellen, und die Verbindung konnte nicht hergestellt werden.

Nach dem Zurückschalten auf Port 5432 funktioniert alles einwandfrei.

  db:
    image: postgres
    ports:
      - 5432:5432
    restart: always
    volumes:
      - "db_sql:/var/lib/mysql"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres_db

Dies war meine Erfahrung, die ich teilen wollte. Vielleicht kann jemand davon Gebrauch machen.

Martin
quelle
3
Volumenpfad : /var/lib/mysql?
David Tabernero M.
5432 ist der Postgres-Standardport. 3306 ist der MySQL-Standardport. Wenn Sie den veröffentlichten Port in Docker-Compose ändern, versuchen alle Client-Tools, die Sie zum Herstellen einer Verbindung verwenden, standardmäßig auch, eine Verbindung zu Port 5432 herzustellen, es sei denn, Sie weisen sie an, einen anderen Port zu verwenden.
Davos
6

Ich gehe davon aus, dass Sie die in Ihrem Container vorhandenen Daten jedes Mal anzeigen möchten, wenn Sie von außen eine Verbindung herstellen. Dazu müssen Sie die Daten auf dem Postgres-Bild beibehalten.

Wenn Sie keine dauerhaften Daten haben, müssen Sie alles wiederholen, was Sie beim ersten Mal getan haben.
Die Schritte 3, 5, 6, 7 und 8 beantworten Ihre Frage direkt.

Hier ist die detaillierte Übersicht über den gesamten Prozess, den ich unter Windows 10 Powershell ausgeführt habe (Befehle sind auch unter Linux und MacOS identisch):

Schritt 1 : Starten Sie Powershell im Nicht-Administrator-Modus

Schritt 2 : Postgres Docker Bild herunterladen:
docker pull postgres:latest

Schritt 3 : Starten Sie den Docker-Container im getrennten Modus und behalten Sie die Daten auf dem Postgres-Image bei, indem Sie ein Volume erstellen und an ein Ziel binden
( Hinweis : Standardmäßig wird 5432 als Standardport verwendet, geben Sie ihn jedoch explizit an, um Verbindungsfehler von Clients wie zu verhindern pgadmin, dbeaver usw.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Schritt 4 : Überprüfen Sie den Status der laufenden Container
docker ps -a

Schritt 5 : Gehen Sie im interaktiven Modus in container_name
( Hinweis : Befehle wie ls, pwd usw. können hier ausgeführt werden, wenn Sie während der Installation Linux-Container überprüft haben).
docker exec -it postgres-test psql -U postgres

Schritt 6 : Erstellen Sie Beispieldaten. Zu diesem Zeitpunkt können Siepsqlauf folgende WeisemitBefehlenspielen:

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

Schritt 7 : Öffnen Sie eine Datenbank-Client-Anwendung wiepgadminoderdbeaverund geben Sie Folgendes in die Verbindungsfelder ein:

Host: localhost
Database: test
User: postgres
Password: password

Schritt 8 : Geben Sie die Abfrageselect * from test_tablein den Abfrageeditor ein und Sie sollten die Ausgabe sehen können123


quelle
5

Aus irgendeinem Grund scheint der 5432-Port geschützt zu sein. Ich habe meine Portkonfiguration von 5432:5432auf geändert 5416:5432und der folgende Befehl hat funktioniert, um von außerhalb des Docker-Containers eine Verbindung zu Ihrer Postgres-Datenbank herzustellen :

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Marc Perrin-Pelletier
quelle
Es funktioniert bei mir, aber ich habe im Internet keine Erklärung gefunden. Hast du gefunden?
Negas
2
@negas Sie führen den postgresDienst wahrscheinlich bereits auf Ihrem Host-Computer aus, der bereits an localhost: 5432 gebunden ist, sodass Sie ihn nicht verwenden können. Die Zuordnung eines anderen Host-Ports zum Standardport 5432 im Container ist eine gute Lösung dafür. Alternativ können Sie den Postgres-Dienst auf Ihrem Host beenden, aber möglicherweise wird er für etwas verwendet, das Sie benötigen.
Davos
5

Öffnen Sie zuerst das Docker-Image für die Postgres

docker exec -it <container_name>

dann bekommst du das root - root@868594e88b53:/# es braucht die Datenbankverbindung

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
Ashutosh Gupta
quelle
1

Falls es sich um eine Django-Backend-Anwendung handelt, können Sie so etwas tun.

docker exec -it container_id python manage.py dbshell
SuperNova
quelle
1

Hier gibt es gute Antworten, aber wenn Sie eine Schnittstelle für die Verwaltung von Postgres-Datenbanken wünschen, können Sie pgAdmin auf Ihrem lokalen Computer installieren und über die IP-Adresse und den Postgres-Port (standardmäßig 5432) eine Verbindung zum Remotecomputer herstellen.

CageE
quelle
0

docker ps -a Um Container-IDs zu erhalten, docker exec -it psql -U -W

Afshin Ghazi
quelle
-1

Ich weiß, dass dies spät ist, wenn Sie Docker-Compose wie @Martin verwendet haben

Dies sind die Schnipsel, die mir geholfen haben, eine Verbindung zu psql im Container herzustellen

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

Ich kann nicht kommentieren, weil ich keinen Ruf habe. Hoffe das hilft.

Rishabh Anand
quelle
Op will sich von außen verbinden.
Avizzzy