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?
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?
Réponses:
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.
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
J'ai réussi à le faire fonctionner sous Linux
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
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
sudo
pour exécuter votre conteneur.
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
su postgres
-on?
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
-e POSTGRES_DB=my-db
pour créer my-db au lieu de postgres
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.
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
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.
/var/lib/mysql
?
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 commepgadmin
oudbeaver
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_table
dans l'éditeur de requête et vous devriez pouvoir voir la sortie123
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 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>
postgres
service 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.
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>
docker ps -a
pour obtenir les identifiants de conteneur, puis docker exec -it psql -U -W
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.