web-dev-qa-db-fra.com

Le conteneur Docker pour Postgres 9.1 n'expose pas le port 5432 à l'hôte

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:

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

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?

28
Jorge Arévalo

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

41
MrGreg

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
9
Ali Dehghani

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.

7
Marcel Posdijk

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
2
Alex Spera

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
2
Roman_K