web-dev-qa-db-fra.com

Connexion à Postgresql dans un conteneur de menu fixe depuis l'extérieur

J'ai PostgreSQL sur un serveur dans un conteneur Docker. Comment puis-je y connecter de l'extérieur, c'est-à-dire de mon ordinateur local? Quel paramètre dois-je appliquer pour permettre cela?

102
Sojo

Vous pouvez exécuter Postgres de cette façon (mapper un port):

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Alors maintenant, vous avez mappé le port 5432 de votre conteneur sur le port 5432 de votre serveur. -p <Host_port>:<container_port>. Alors maintenant votre postgres est accessible à partir de votre public-server-ip:5432

Pour tester: Exécutez la base de données postgres (commande ci-dessus)

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

Allez dans votre conteneur et créez une base de données:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Accédez à votre hôte local (où vous avez un outil ou le client psql).

psql -h public-ip-server -p 5432 -U postgres

(mot de passe mysecretpassword)

postgres=# \l

                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

Donc, vous accédez à la base de données (qui tourne dans docker sur un serveur) à partir de votre hôte local.

Dans ce post il est expliqué en détail.

211
lvthillo

J'ai réussi à le faire fonctionner sur Linux

  • 1 lancez d'abord le docker postgres, assurez-vous que le port est publié, j'utilise Alpine car il est léger.

    Sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:Alpine 

  • 2 utilisez un autre terminal, accédez à la base de données à partir de l'hôte à l'aide de postgres uri

    psql postgresql://postgres:1234@localhost:5432/postgres

pour les utilisateurs de mac, remplacez psql par pgcli

16
Thomas Webber

J'avais déjà exécuté postgres sur la machine hôte et je ne voulais pas autoriser les connexions depuis le réseau. J'ai donc exécuté une instance postgres temporaire dans un conteneur et créé une base de données en deux lignes seulement:

# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres

# Create database
docker exec -it postgres-container createdb -U postgres my-db
11
Eugene

Vous pouvez également accéder via la commande docker exec également.

$ docker exec -it postgres-container bash

# su postgres

$ psql
11
SuperNova

J'utilise Django avec Postgres dans des conteneurs Docker. dans le fichier docker-compose, ajoutez les éléments suivants:

db:
    image: postgres:10-Alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

qui va ajouter un port accessible par votre machine locale. pour ma part, j’y ai connecté DBeaver. Cela évitera les conflits de ports entre votre demande d'application et la demande d'ordinateur local. Au début, j'ai reçu un message disant que le port 5432 était en cours d'utilisation (c'est-à-dire par l'application Django) et que je ne pouvais donc pas y accéder par pgAdmin ou DBeaver.

2
omeraiman

Pour vous connecter à partir de l'hôte local, vous devez ajouter '--net Host':

docker run --name some-postgres --net Host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Vous pouvez accéder directement au serveur sans utiliser exec de votre localhost, en utilisant:

psql -h localhost -p 5432 -U postgres
1
user2627846

J'ai essayé de me connecter depuis localhost (mac) à un conteneur postgres. J'ai changé le port dans le fichier docker-compose de 5432 à 3306 et démarré le conteneur. Aucune idée pourquoi je l'ai fait: |

Ensuite, j'ai essayé de me connecter à postgres via PSequel et l'administrateur et la connexion n'a pas pu être établie.

Après être revenu sur le port 5432, tout fonctionne correctement.

  db:
    image: postgres
    ports:
      - 5432:5432
    restart: always
    volumes:
      - "db_sql:/var/lib/mysql"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres_db

C'était mon expérience que je voulais partager. Peut-être que quelqu'un peut s'en servir.

1
Martin

d'abord ouvrir l'image de docker pour le postgres

docker exec -it <container_name>

alors vous obtiendrez la racine --root@868594e88b53:/#it besoin de la connexion à la base de données 

psql postgresql://<tablename>:<databasepassword>@postgres:5432/<database>
0
ashutosh gupta

docker ps -a pour obtenir les identifiants de conteneur, puis docker exec -it psql -U -W

0
Afshin Ghazi

S'il s'agit d'une application dorsale Django, vous pouvez faire quelque chose comme ceci.

docker exec -it container_id python manage.py dbshell
0
SuperNova

Il y a de bonnes réponses ici, mais si vous souhaitez avoir une interface pour la gestion de base de données postgres, vous pouvez installer pgAdmin sur votre ordinateur local et vous connecter à la machine distante à l'aide de son adresse IP et du port exposé postgres (par défaut, 5432).

0
CageE

Pour une raison quelconque, le port 5432 semble protégé. J'ai changé ma configuration de port de 5432:5432 à 5416:5432 et la commande suivante a fonctionné pour vous connecter à votre base de données postgres de l'extérieur de son conteneur docker :

psql -h localhost -p 5416 -U <my-user> -d <my-database>
0
Marc Pe-Pe