Connessione a Postgresql in un contenitore docker dall'esterno


Risposte:


318

Puoi eseguire Postgres in questo modo (mappare una porta):

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

Quindi ora hai mappato la porta 5432 del tuo contenitore sulla porta 5432 del tuo server. -p <host_port>:<container_port> Quindi ora i tuoi postgres sono accessibili dal tuopublic-server-ip:5432

Per testare: esegui il database postgres (comando sopra)

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

Entra nel tuo contenitore e crea un database:

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

Vai al tuo localhost (dove hai qualche strumento o il client psql).

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

(password 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   

Quindi stai accedendo al database (che è in esecuzione nella finestra mobile su un server) dal tuo host locale.

In questo post è spiegato in dettaglio.


1
@Tjorriemorrie Sei sicuro che i tuoi postgres siano in esecuzione sul tuo computer locale? Forse prova 127.0.0.1 invece di localhost ma per met funziona.
lvthillo,

2
Ottieni il tuo indirizzo IP pubblico (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

5
Di tutti i vari post relativi a postgres / docker che ho trovato questo è uno dei più utili. Grazie.
rg88,

1
@GarouDan se non vuoi mappare una porta ma vuoi ancora accedere al container postgres dal tuo host dovrai distribuire il tuo container sulla rete host in questo modo:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo,

1
uscire da psql funziona con \ q (solo per i neofiti come me)
Dirk Schumacher,

44

Sono riuscito a farlo funzionare su Linux

  1. eseguo la finestra mobile postgres - assicurati che il porto sia pubblicato, io uso alpino perché è leggero.

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

  2. usando un altro terminale, accedi al database dall'host usando l'uri postgres

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

per gli utenti mac, sostituire psql con pgcli


7
felice che qualcuno abbia risposto a come connettersi senza saltare nel contenitore. thnx.
PabTorre,

1
Non dovresti davvero usarlo sudoper eseguire il tuo contenitore.
Russ Bateman,

30

È inoltre possibile accedere tramite il comando exec docker:

$ docker exec -it postgres-container bash

# su postgres

$ psql

O

$ docker exec -it postgres-container psql -U postgres

3
psql -U postgres
Maryna Krasnova

è un commento sorprendentemente utile
Dan Rosenstark,

Cosa fa su postgres?
Breno,

14

Avevo già in esecuzione postgres sul computer host e non volevo consentire connessioni dalla rete, quindi ho eseguito l'istanza postgres temporanea nel contenitore e ho creato il database in sole due righe:

# 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

se vuoi creare un singolo database predefinito puoi anche aggiungere: -e POSTGRES_DB=my-dbper creare my-db invece di postgres
spasso il

13

Sto usando Django con Postgres nei contenitori Docker. nel file composito docker, aggiungere quanto segue:

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

che aggiungerà la porta accessibile dal tuo computer locale. per quanto mi riguarda, ho collegato DBeaver ad esso. questo eviterà conflitti di porte tra la richiesta dell'app e la richiesta del computer locale. all'inizio, ho ricevuto un messaggio che diceva che la porta 5432 è in uso (che è app django) quindi non ho potuto accedere da pgAdmin o DBeaver.


1
Ho trovato questo per essere il più utile. Per le persone che usano la finestra mobile, questo sembra il modo migliore per andare.
David Frick,

Grazie David, buona programmazione!
omeraiman,

9

Per connettersi dall'host locale è necessario aggiungere "--net host":

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

Puoi accedere direttamente al server senza usare exec dal tuo localhost, usando:

psql -h localhost -p 5432 -U postgres

6

Ho provato a connettermi da localhost (mac) a un contenitore Postgres. Ho cambiato la porta nel file comporre docker da 5432 a 3306 e ho avviato il contenitore. Non ho idea del perché l'ho fatto: |

Quindi ho provato a collegarmi a Postgres tramite PSequel e admin e la connessione non è stata stabilita.

Dopo il passaggio alla porta 5432 tutto funziona bene.

  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

Questa è stata la mia esperienza che volevo condividere. Forse qualcuno può farne uso.


3
Percorso Volume: /var/lib/mysql?
David Tabernero M.,

5432 è la porta predefinita di Postgres. 3306 è la porta predefinita di MySQL. Se si modifica la porta pubblicata in docker-compose, anche qualsiasi strumento client che si tenta di utilizzare per connettersi verrà automaticamente impostato come tentativo di connettersi alla porta 5432, a meno che non si indichi di utilizzare un'altra porta.
Davos,

6

Presumo che tu voglia essere in grado di visualizzare i dati presenti nel tuo contenitore ogni volta che ti connetti ad esso dall'esterno. Per fare questo, si dovrà persistere dati di immagine del Postgres su.

Se non disponi di dati persistenti, dovrai ripetere tutto ciò che hai fatto la prima volta.
I passaggi 3, 5, 6, 7 e 8 rispondono direttamente alla tua domanda.

Ecco la panoramica dettagliata dell'intero processo che ho seguito su Windows 10 PowerShell (i comandi sono gli stessi anche in Linux e macOS):

Passaggio 1 : avviare PowerShell in modalità non amministratore

Step 2 : Scarica l'immagine docker di postgres:
docker pull postgres:latest

Passaggio 3 : avviare il contenitore finestra mobile in modalità distaccata e conservare i dati sull'immagine postgres creando un volume e associandolo a una destinazione
( Nota : per impostazione predefinita 5432 è la porta predefinita utilizzata; ma dichiararlo esplicitamente per evitare errori di connessione da client come pgadmin, dbeaver, ecc.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Passaggio 4 : controllare lo stato dei contenitori in esecuzione
docker ps -a

Passaggio 5 : vai all'interno di container_name in modalità interattiva
( Nota : comandi come ls, pwd, ecc. Possono essere eseguiti qui se hai controllato i contenitori Linux durante l'installazione)
docker exec -it postgres-test psql -U postgres

Passaggio 6 : creare dati di esempio. A questo punto, puoi giocare con ipsqlcomandi nel modo seguente:

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

Passaggio 7 : Aprire un'applicazione client di database comepgadminodbeavere immettere quanto segue nei campi di connessione:

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

Passaggio 8 : immettere la queryselect * from test_tablenell'editor di query e si dovrebbe essere in grado di vedere l'output123


5

Per qualche motivo la porta 5432 sembra protetta. Ho cambiato la mia configurazione della porta da 5432:5432a 5416:5432e il seguente comando ha funzionato per connettermi al tuo database postgres dall'esterno del suo contenitore finestra mobile :

psql -h localhost -p 5416 -U <my-user> -d <my-database>

Funziona per me ma non ho trovato una spiegazione su Internet. Hai trovato?
negas,

2
@negas Probabilmente stai già eseguendo il postgresservizio sul tuo computer host che si legherà già a localhost: 5432 impedendoti di usarlo. Mappare una porta host diversa sulla porta 5432 predefinita all'interno del contenitore è una buona soluzione a questo; in alternativa potresti interrompere il servizio Postgres sul tuo host, ma forse è usato per qualcosa di cui hai bisogno.
Davos,

5

per prima cosa apri l'immagine docker per i postgres

docker exec -it <container_name>

allora otterrai il root - root@868594e88b53:/# ha bisogno della connessione al database

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

1

Nel caso, si tratta di un'applicazione back-end Django, puoi fare qualcosa del genere.

docker exec -it container_id python manage.py dbshell

1

Ci sono buone risposte qui, ma se ti piace avere un'interfaccia per la gestione del database postgres, puoi installare pgAdmin sul tuo computer locale e collegarti al computer remoto usando il suo IP e la porta esposta postgres (di default 5432).


0

docker ps -a per ottenere gli ID contenitore, quindi la finestra mobile exec -it psql -U -W


-1

So che è tardi, se hai usato la composizione docker come @Martin

Questi sono gli snippet che mi hanno aiutato a connettermi a psql all'interno del contenitore

docker-compose run db bash

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

Non posso commentare perché non ho 50 reputazione. Quindi spero che questo aiuti.


Op vuole connettersi dall'esterno.
avizzzy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.