Ho Postgresql su un server in un contenitore docker. Come posso collegarmi dall'esterno, cioè dal mio computer locale? Quale impostazione devo applicare per consentirlo?
Ho Postgresql su un server in un contenitore docker. Come posso collegarmi dall'esterno, cioè dal mio computer locale? Quale impostazione devo applicare per consentirlo?
Risposte:
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.
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
Sono riuscito a farlo funzionare su Linux
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
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
sudo
per eseguire il tuo contenitore.
È 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
su postgres
?
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
-e POSTGRES_DB=my-db
per creare my-db invece di postgres
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.
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
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.
/var/lib/mysql
?
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 ipsql
comandi 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 comepgadmin
odbeaver
e immettere quanto segue nei campi di connessione:
Host: localhost
Database: test
User: postgres
Password: password
Passaggio 8 : immettere la queryselect * from test_table
nell'editor di query e si dovrebbe essere in grado di vedere l'output123
Per qualche motivo la porta 5432 sembra protetta. Ho cambiato la mia configurazione della porta da 5432:5432
a 5416:5432
e 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>
postgres
servizio 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.
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>
docker ps -a
per ottenere gli ID contenitore, quindi la finestra mobile exec -it psql -U -W
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.