2016-03-10 9 views
12

Sto provando a utilizzare un contenitore Docker per eseguire un server PostgreSQL e connettersi con esso dal mio computer host.Contenitore Docker per Postgres 9.1 che non espone la porta 5432 all'host

La mia configurazione è: macchina

  • Host: Mac OS X 10.10.5
  • Docker 1.10.1

Ho fatto questo:

Fase 1 : crea un volume per i dati postgres permanenti

docker volume create --name postgres_data 

Fase 2: Avviare l'istanza postgres

UPDATE: Come suggerito nei commenti, ho specificato mappatura delle porte durante l'esecuzione del contenitore

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1 

Fase 3: connettersi a un'istanza Docker facendo così:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

Bu t Voglio collegarmi a quell'istanza semplicemente:

psql -h localhost -p 5432 -U postgres 

Come se avessi installato Postgres localmente nel mio computer host.

Il problema è la porta 5432 non è esposta. Quindi, non posso agganciare:

sudo lsof -i -P | grep -i "listen" -> nessuna porta 5432 aperta

UPDATE 2: Ancora più strano. Ho anche fatto questo:

Stop Docker. Quindi, esegui una normale istanza di PostgreSQL 9.4.4 nel mio computer host (nessuna finestra mobile coinvolta qui, solo postgres in esecuzione nel mio host Mac OS X, in ascolto sulla porta 5432). Tutto normale:

sudo lsof -i -P | grep -i "postgres" 

postgres 14100   jorge 6u IPv4 0x780274158cebef01  0t0 TCP localhost:5432 (LISTEN) 

posso collegare con il mio esempio postgres locale senza alcun problema (vedi l'output del comando: è il postgres compilati per Mac OS X, il mio ospite):

psql -h localhost -U postgres -c "select version()" 
                   version 
--------------------------------------------------------------------------------------------------------------------------------------- 
PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit 
(1 row) 

Ora la parte divertente. Avvio di nuovo l'istanza di Docker, mentre è in esecuzione l'istanza di PostgreSQL host.

Inizia! (e non dovrebbe). Posso anche connettersi utilizzando run finestra mobile ...

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

Se corro selezionare la versione() ora, si mostra Postgres che eseguono dentro il mio esempio finestra mobile allo stesso postgres tempo sta per scadere nel mio ospite, fuori di finestra mobile, utilizzando la stessa porta 5432.(Guarda l'output, è Postgres compilati per Debian, il sistema operativo all'interno dei postgres: 9.1 contenitore)

postgres=# select version(); 
              version 
------------------------------------------------------------------------------------------------ 
PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit 
(1 row) 

Perché?

Ha senso? Il mio obiettivo finale è per eseguire un'app Django in un altro contenitore Docker e connettersi con l'istanza Postgres. Come potrei farlo?

risposta

7

eseguire l'immagine postgre con la corretta Port Mapping utilizzando -p <host_port>:<container_port>:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1 
+0

Grazie! L'ho fatto. Ma ancora non riesco a connettermi usando psql. la porta 5432 non viene esposta o non so come connettersi. Il programma psql del mio ospite funziona correttamente (posso connettermi ad altri host, ma non al mio contenitore) – jorgeas80

+0

Cosa mostra "porta mobile "? –

+0

Dovrebbe stampare qualcosa come '5432/tcp -> 0.0.0.0: 5432' –

6

vostro ospite finestra mobile è una macchina virtuale, che ha il proprio adddres IP. È possibile rilevare questo indirizzo IP immettendo il seguente comando:

docker-machine ip 

La risposta sarà qualcosa di simile 192.168.99.100

Dopo aver mappato le porte utilizzando il -p 5432: 5432 interruttore, sarai in grado di connetterti a postgres con qualsiasi strumento dalla tua macchina dev utilizzando l'indirizzo IP menzionato.

2

È il 2018 e ho appena avuto un problema simile. La soluzione per me sembrava essere nell'ordine degli oggetti di scena nella finestra mobile. per esempio. ciò ha comportato che nessuna porta fosse esposta;

docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

mentre questo funzionava bene (immagine porta 5432 come previsto esposto);

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

+0

risolte per me, grazie! – PepeHands

Problemi correlati