J'essaie d'utiliser un conteneur Docker pour exécuter un serveur PostgreSQL et me connecter avec ce dernier à partir de mon ordinateur hôte.
Ma configuration est:
J'ai fait ça:
Step 1: créer un volume pour les données postgres permanentes
docker volume create --name postgres_data
Step 2: Démarrer l'instance postgres
UPDATE : Comme suggéré dans les commentaires, j'ai spécifié 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: connectez-vous à l'instance Docker en procédant comme suit:
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 à cette instance simplement par:
psql -h localhost -p 5432 -U postgres
Comme si j'avais installé Postgres localement sur mon ordinateur hôte.
Le problème est le port 5432 n'est pas exposé. Donc, je ne peux pas me connecter avec ça:
Sudo lsof -i -P | grep -i "listen"
-> pas de port 5432 ouvert
PDATE 2: Même étranger. J'ai aussi fait ça:
Arrêtez Docker. Ensuite, exécutez une instance PostgreSQL 9.4.4 normale sur mon ordinateur hôte (aucun menu fixe n’est impliqué ici, il s’agit simplement de postgres s’exécutant sur mon hôte Mac OS X et écoutant 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 à mon instance locale postgres sans aucun problème (regardez le résultat de la commande: le postgres est-il 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 redémarre mon instance Docker, pendant que l'instance Host PostgreSQL est en cours d'exécution.
Il commence! (et ça ne devrait pas). Je peux même me connecter en utilisant docker run ...
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 s'exécutant dans mon instance de docker en même temps que postgres est exécuté dans mon hôte, en dehors du menu fixe, en utilisant le même port 5432. (Regardez la sortie, est postgres compilé pour Debian, le système d’exploitation à l’intérieur du conteneur postgres: 9.1)
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?
Est-ce que ça fait du sens? Mon objectif final est exécuter une Django dans un autre conteneur Docker et vous connecter à mon instance Postgres. Comment pourrais-je faire cela?
Nous sommes en 2018 et je viens d'avoir un problème similaire. La solution pour moi semblait être avec l'ordre des accessoires au docker. par exemple. cela a eu pour résultat qu'aucun port n'a été exposé;
docker run -d --name posttest postgres:Alpine -e POSTGRES_PASSWORD=fred -p 5432:5432
alors que 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
Exécutez l'image postgre avec le correct Port Mapping en utilisant -p <Host_port>:<container_port>
:
docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1
Votre hôte docker est une machine virtuelle qui possède ses propres adresses IP. Vous pouvez détecter cette adresse IP en entrant la commande suivante:
docker-machine ip
La réponse sera quelque chose comme 192.168.99.1
Une fois les ports mappés à l'aide du commutateur -p 5432: 5432, vous pourrez vous connecter à postgres avec n'importe quel outil de votre machine de développement en utilisant l'adresse IP mentionnée.
J'ai eu un problème similaire. Mon problème était simplement 0.0.0.0 ne pas mapper à localhost, donc je devais juste ajouter à psql
psql --Host=0.0.0.0
C'est présumer
docker port <container name>
les sorties
5432/tcp -> 0.0.0.0:5432
J'ai pu me connecter à l'aide du conteneur IP ou de l'hôte IP, à l'exception de localhost (127.0.0.1).
Pour obtenir un identifiant de conteneur exécuté
docker ps
Rechercher l'ID de conteneur requis et exécuter
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>
Le port doit être exposé.
Voici un exemple de docker-compose.yml qui démarre deux conteneurs postgres et adminer, un outil de gestion de base de données que vous pouvez utiliser pour vous connecter à postgres:
version: '3'
services:
adminer:
image: adminer
restart: always
ports:
- 8080:8080
postgres:
image: postgres:11.4-Alpine
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres