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?
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?
Antworten:
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.
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Ich habe es geschafft, es unter Linux zum Laufen zu bringen
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
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
sudo
Ihren Container wirklich nicht zum Ausführen verwenden.
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
su postgres
das
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
-e POSTGRES_DB=my-db
Folgendes hinzufügen: my-db anstelle von postgres erstellen
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.
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
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.
/var/lib/mysql
?
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 Siepsql
auf 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 wiepgadmin
oderdbeaver
und geben Sie Folgendes in die Verbindungsfelder ein:
Host: localhost
Database: test
User: postgres
Password: password
Schritt 8 : Geben Sie die Abfrageselect * from test_table
in den Abfrageeditor ein und Sie sollten die Ausgabe sehen können123
Aus irgendeinem Grund scheint der 5432-Port geschützt zu sein. Ich habe meine Portkonfiguration von 5432:5432
auf geändert 5416:5432
und 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>
postgres
Dienst 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.
Ö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>
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.
docker ps -a
Um Container-IDs zu erhalten, docker exec -it psql -U -W
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.