Conteneur Docker pour Postgres 9.1 de ne pas exposer le port 5432 d'hôte

Je suis en train d'utiliser un conteneur Docker pour exécuter un serveur PostgreSQL, et de s'y connecter à partir de mon ordinateur hôte.

Ma configuration est:

  • Machine hôte: Mac OS X 10.10.5
  • Docker 1.10.1

J'ai fait ceci:

Étape 1: créer un volume permanente de données postgres

docker volume create --name postgres_data

Étape 2: Démarrage de l'postgres instance

Mise à JOUR: Comme suggéré dans les commentaires, j'ai précisé que le mappage de port lors de l'exécution du conteneur

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

Étape 3: se connecter à Docker exemple en faisant ceci:

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'

Mais je veux me connecter à une instance de la juste par:

psql -h localhost -p 5432 -U postgres

Comme si je l'avais installé Postgres localement dans mon ordinateur hôte.

Le problème est le port 5432 n'est pas exposé. Donc, je ne peux pas me connecter avec elle:

sudo lsof -i -P | grep -i "listen" --> pas de port 5432 ouvrir

Mise à JOUR 2: Même à l'étranger. J'ai aussi fait ça:

Arrêter De Docker. Ensuite, exécutez une normale PostgreSQL 9.4.4 instance dans mon ordinateur hôte (pas de menu fixe en cause ici, juste postgres courant dans ma Mac OS X d'accueil, à l'écoute sur le port 5432). Tout est normal:

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

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

Je peux me connecter avec mon local postgres instance sans aucun problème (voir la sortie de la commande: la postgres compilé pour Mac OS X, mon hôte):

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)

Maintenant la partie amusante. Je commence mon menu fixe instance de nouveau, tandis que l'hôte instance PostgreSQL est en cours d'exécution.

Il commence! (et il ne devrait pas). Je peux même vous connecter en utilisant le panneau exécuter...

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'

Si je lance select version() maintenant, il montre postgres cours d'exécution à l'intérieur de mon menu fixe instance dans le même temps, postgres est en cours d'exécution dans mon hôte, de docker, en utilisant le même port 5432. (Regardez la sortie, postgres est compilé pour Debian, le système d'exploitation à l'intérieur de la postgres:9.1 conteneur)

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)

Pourquoi?

T-il un sens? Mon objectif final est pour exécuter un Django app dans un autre conteneur Docker et se connecter avec mon Postgres instance. Comment pourrais-je le faire?

OriginalL'auteur Jorge Arévalo | 2016-03-10