Connexion à PostgreSQL dans un conteneur Docker depuis l'extérieur

202

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

Sojo
la source
1
quelle commande avez-vous utilisé pour démarrer le postresql? vous êtes en mesure d'exposer un port et de le cartographier
lvthillo
Se reporter ce reachmnadeem.wordpress.com/2020/06/02/...
craftsmannadeem

Réponses:

318

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

Vous avez maintenant mappé le port 5432 de votre conteneur sur le port 5432 de votre serveur. -p <host_port>:<container_port> .Donc maintenant, vos postgres sont accessibles depuis votrepublic-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

Entrez 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   

Vous accédez donc à la base de données (qui s'exécute dans docker sur un serveur) à partir de votre hôte local.

Dans cet article, il est expliqué en détail.

lvthillo
la source
1
@Tjorriemorrie Vous êtes sûr que vos postgres fonctionnent sur votre machine locale? Essayez peut-être 127.0.0.1 au lieu de localhost mais pour met cela fonctionne.
lvthillo
2
Obtenez votre adresse IP publique (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul
5
De tous les divers messages liés à postgres / docker, j'ai trouvé que c'était l'un des plus utiles. Je vous remercie.
rg88
1
@GarouDan si vous ne souhaitez pas mapper un port mais souhaitez tout de même accéder au conteneur postgres depuis votre hôte, vous devrez déployer votre conteneur sur le réseau hôte comme ceci:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo
1
quitter psql fonctionne avec \ q (juste pour les débutants comme moi)
Dirk Schumacher
44

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

  1. lancez le docker postgres - assurez-vous que le port est publié, j'utilise alpin 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. en utilisant un autre terminal, accédez à la base de données depuis l'hôte en utilisant l'uri postgres

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

pour les utilisateurs de mac, remplacez psql par pgcli

Thomas Webber
la source
7
heureux que quelqu'un ait répondu comment se connecter sans sauter dans le conteneur. thnx.
PabTorre
1
Vous ne devriez vraiment pas utiliser sudopour exécuter votre conteneur.
Russ Bateman
30

Vous pouvez également accéder via la commande docker exec en:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Ou

$ docker exec -it postgres-container psql -U postgres
SuperNova
la source
3
psql -U postgres
Maryna Krasnova
c'est un commentaire étonnamment utile
Dan Rosenstark
Que fait su postgres-on?
Breno
14

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

# 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
Eugène
la source
si vous voulez créer une seule base de données par défaut, vous pouvez également ajouter: -e POSTGRES_DB=my-dbpour créer my-db au lieu de postgres
framp
13

J'utilise django avec postgres dans des conteneurs Docker. dans le fichier docker-compose, ajoutez ce qui suit:

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

qui ajoutera un port accessible par votre machine locale. pour moi, j'y ai connecté DBeaver. cela évitera les conflits de ports entre votre demande d'application et la demande de l'ordinateur local. au début, j'ai reçu un message disant que le port 5432 est en cours d'utilisation (qui est par l'application django) donc je n'ai pas pu accéder par pgAdmin ou DBeaver.

omeraiman
la source
1
J'ai trouvé que c'était le plus utile. Pour les personnes qui utilisent docker-compose, cela semble être la meilleure solution.
David Frick le
Merci David, bon codage!
omeraiman
9

Pour vous connecter depuis 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 depuis votre hôte local, en utilisant:

psql -h localhost -p 5432 -U postgres
user2627846
la source
6

J'ai essayé de me connecter de localhost (mac) à un conteneur postgres. J'ai changé le port dans le fichier docker-compose de 5432 à 3306 et j'ai 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 au 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 en profiter.

Martin
la source
3
Chemin du volume: /var/lib/mysql?
David Tabernero M.
5432 est le port par défaut de Postgres. 3306 est le port par défaut de MySQL. Si vous modifiez le port publié dans docker-compose, tous les outils clients que vous essayez d'utiliser pour vous connecter essaieront également par défaut de se connecter au port 5432, sauf si vous leur dites d'utiliser un autre port.
Davos
6

Je suppose que vous voulez pouvoir afficher les données présentes dans votre conteneur à chaque fois que vous vous y connectez de l'extérieur. Pour ce faire, vous devrez conserver les données sur l'image postgres.

Si vous ne disposez pas de données persistantes, vous devrez répéter tout ce que vous avez fait la première fois.
Les étapes 3, 5, 6, 7 et 8 répondent directement à votre question.

Voici un aperçu détaillé de l'ensemble du processus que j'ai suivi sous Windows 10 PowerShell (les commandes sont les mêmes sous Linux et macOS également):

Étape 1 : Démarrez PowerShell en mode non-administrateur

Étape 2 : Téléchargez l'image docker postgres:
docker pull postgres:latest

Étape 3 : Démarrez le conteneur Docker en mode détaché et conservez les données sur l'image postgres en créant un volume et en le liant à une destination
( Remarque : par défaut, 5432 est le port par défaut utilisé; mais indiquez-le explicitement pour éviter les erreurs de connexion de clients comme pgadmin, dbeaver, etc.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

Étape 4 : vérifier l'état des conteneurs en cours d'exécution
docker ps -a

Étape 5 : Accédez à container_name en mode interactif
( Remarque : les commandes comme ls, pwd, etc. peuvent être exécutées ici si vous avez vérifié les conteneurs Linux lors de l'installation)
docker exec -it postgres-test psql -U postgres

Étape 6 : Créez des exemples de données. À ce stade, vous pouvez jouer avecpsql commandes de la manière suivante:

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

Étape 7 : Ouvrez une application client de base de données commepgadminoudbeaver et saisissez ce qui suit dans les champs de connexion:

Host: localhost
Database: test
User: postgres
Password: password

Étape 8 : Entrez la requêteselect * from test_tabledans l'éditeur de requête et vous devriez pouvoir voir la sortie123


la source
5

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

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Marc Perrin-Pelletier
la source
Cela fonctionne pour moi mais je n'ai pas trouvé d'explication sur Internet. Avez-vous trouvé?
negas
2
@negas Vous exécutez probablement déjà le postgresservice sur votre machine hôte qui se liera déjà à localhost: 5432 vous empêchant de l'utiliser. Le mappage d'un port d'hôte différent au port par défaut 5432 à l'intérieur du conteneur est une bonne solution à cela; Sinon, vous pouvez arrêter le service postgres sur votre hôte, mais il est peut-être utilisé pour quelque chose dont vous avez besoin.
Davos
5

ouvrez d'abord l'image du docker pour les postgres

docker exec -it <container_name>

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

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
ashutosh gupta
la source
1

Dans le cas où il s'agit d'une application django backend, vous pouvez faire quelque chose comme ça.

docker exec -it container_id python manage.py dbshell
SuperNova
la source
1

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

CageE
la source
0

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

Afshin Ghazi
la source
-1

Je sais que c'est tard, si vous avez utilisé docker-compose comme @Martin

Voici les extraits qui m'ont aidé à me connecter à psql à l'intérieur du conteneur

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

Je ne peux pas faire de commentaire car je n'ai pas 50 réputation. Alors j'espère que cela vous aidera.

Rishabh Anand
la source
Op veut se connecter de l'extérieur.
avizzzy le