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
Vous devez vous connecter pour publier un commentaire.
C'est 2018 et j'ai juste eu un problème similaire. La solution qu'il me semblait être à la commande d'accessoires pour docker. par exemple, ce qui a entraîné aucun port exposés;
docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432
tout cela a bien fonctionné (image exposée port 5432 comme prévu);
docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine
Merci beaucoup!
Incroyable, l'homme! C'est s**ats option de commande 🙂
Quelqu'un pourrait-il expliquer pourquoi dans cet ordre de questions? Merci
Ma compréhension est que les arguments passés à la suite du nom de l'image est réalisé à la commande qui est exécutée dans le conteneur, et les arguments passés avant le nom de l'image sont passés à Docker
OriginalL'auteur MrGreg
Exécuter le postgre image avec le bon Mappage de Port à l'aide de
-p <host_port>:<container_port>
:Ce n'
docker port <container_name>
d'affichage?Il devrait afficher quelque chose comme
5432/tcp -> 0.0.0.0:5432
5432/tcp -> 0.0.0.0:5432. Essayé avec l'option-h 0.0.0.0 -p 5432. L'obtention de la connexion refusée erreur: le serveur Est en cours d'exécution...? Puis-je vraiment vous connecter à l'aide de la simple psql ou dois-je exécuter un autre récipient à tester la qualité de psql? Parce que la doc officielle ne pas utiliser la normale psql commande: hub.docker.com/_/postgres
Vous devriez être en mesure d'utiliser tout simplement
psql
.. avez-vous essayé-h 127.0.0.1 -p 5432
?OriginalL'auteur Ali Dehghani
Votre panneau d'accueil est une machine virtuelle, qui a sa propre IP adddres.
Vous pouvez détecter cette adresse IP en entrant la commande suivante:
La réponse sera quelque chose comme 192.168.99.100
Lorsque vous avez mappé les ports à l'aide de l'-p 5432:5432 commutateur, vous serez en mesure de se connecter à postgres avec n'importe quel outil à partir de votre dev machine à l'aide de l'adresse IP mentionnée.
OriginalL'auteur Marcel Posdijk