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?
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
Cosa mostra "porta mobile"? –
Dovrebbe stampare qualcosa come '5432/tcp -> 0.0.0.0: 5432' –