web-dev-qa-db-fra.com

Connectez-vous à postgres dans le conteneur Docker à partir de la machine hôte.

Comment puis-je me connecter à postgres in docker à partir d'un ordinateur hôte?

docker-compose.yml

version: '2'

networks:
    database:
        driver: bridge
services:
    app:
        build:
            context: .
            dockerfile: Application.Dockerfile
        env_file:
            - docker/Application/env_files/main.env
        ports:
            - "8060:80"
        networks:
           - database
        depends_on:
            - appdb

    appdb:
        image: postdock/postgres:1.9-postgres-extended95-repmgr32
        environment:
            POSTGRES_PASSWORD: app_pass
            POSTGRES_USER: www-data
            POSTGRES_DB: app_db
            CLUSTER_NODE_NETWORK_NAME: appdb
            NODE_ID: 1
            NODE_NAME: node1
        ports:
            - "5432:5432"
        networks:
            database:
                aliases:
                    - database

docker-compose ps

           Name                          Command               State               Ports
-----------------------------------------------------------------------------------------------------
appname_app_1     /bin/sh -c /app/start.sh         Up      0.0.0.0:8060->80/tcp
appname_appdb_1   docker-entrypoint.sh /usr/ ...   Up      22/tcp, 0.0.0.0:5432->5432/tcp

De conteneur je peux me connecter avec succès. À la fois depuis le conteneur d'applications et le conteneur de bases de données.

Liste des dbs et des utilisateurs de psql en cours d'exécution à l'intérieur du conteneur:

# psql -U postgres
psql (9.5.13)
Type "help" for help.

postgres=# \du
                                       List of roles
    Role name     |                         Attributes                         | Member of
------------------+------------------------------------------------------------+-----------
 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replication_user | Superuser, Create role, Create DB, Replication             | {}
 www-data         | Superuser                                                  | {}

postgres=# \l
                                       List of databases
      Name      |      Owner       | Encoding |  Collate   |   Ctype    |   Access privileges
----------------+------------------+----------+------------+------------+-----------------------
 app_db         | postgres         | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres       | postgres         | UTF8     | en_US.utf8 | en_US.utf8 |
 replication_db | replication_user | UTF8     | en_US.utf8 | en_US.utf8 |
 template0      | postgres         | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                |                  |          |            |            | postgres=CTc/postgres
 template1      | postgres         | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                |                  |          |            |            | postgres=CTc/postgres
(5 rows)

L'image de la BD n'est pas l'image officielle de Postgres. Mais Dockerfile dans GitHub semble bien paraître.

cat /var/lib/postgresql/data/pg_hba.conf à partir du conteneur de base de données:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
Host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
Host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                trust
#Host    replication     postgres        127.0.0.1/32            trust
#Host    replication     postgres        ::1/128                 trust

Host all all all md5
Host replication replication_user 0.0.0.0/0 md5

J'ai essayé les deux utilisateurs sans chance

$ psql -U postgres -h localhost
psql: FATAL:  role "postgres" does not exist
$ psql -h localhost -U www-data appdb -W
Password for user www-data:
psql: FATAL:  role "www-data" does not exist

On dirait que sur mon ordinateur hôte, PSQL est déjà en cours d'exécution sur ce port. Comment puis-je le vérifier?

10
mef_

Je l'ai couru sur Ubuntu 16.04

$ psql -h localhost -U www-data app_db
Password for user www-data:
psql (9.5.13)
Type "help" for help.

app_db=# \du
                                       List of roles
    Role name     |                         Attributes                         | Member of
------------------+------------------------------------------------------------+-----------
 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replication_user | Superuser, Create role, Create DB, Replication             | {}
 www-data         | Superuser                                                  | {}

Et ci-dessous de mon mac à la VM à l'intérieur duquel le menu fixe était en cours d'exécution (192.168.33.100 correspond à l'adresse IP de la machine virtuelle du menu fixe)

$ psql -h 192.168.33.100 -U www-data app_db
Password for user www-data:
psql (9.6.9, server 9.5.13)
Type "help" for help.

app_db=# \du
                                       List of roles
    Role name     |                         Attributes                         | Member of
------------------+------------------------------------------------------------+-----------
 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replication_user | Superuser, Create role, Create DB, Replication             | {}
 www-data         | Superuser                                                  | {}

Ils travaillent tous les deux pour moi. 

Version de PSQL sur VM

$ psql --version
psql (PostgreSQL) 9.5.13

Version PSQL sur Mac

$ psql --version
psql (PostgreSQL) 9.6.9

 Working

2
Tarun Lalwani

Je crois que vous avez un problème dans pg_hba.conf. Ici, vous avez spécifié 1 hôte ayant accès - 127.0.0.1/32.

Vous pouvez le changer en ceci:

# IPv4 local connections:
Host    all             all             0.0.0.0/0            md5

Cela garantira que votre hôte (adresse IP totalement différente) peut se connecter.

Pour vérifier si une instance de postgresql est déjà en cours d'exécution, vous pouvez exécuter netstat -plnt | grep 5432. Si vous obtenez un résultat, vous pouvez obtenir le PID et vérifier le processus lui-même. 

0
wadhg

J'ai eu le même problème sous OS 5.0 élémentaire lors de l'exécution de postgres 10 docker officiel. J'ai pu me connecter à partir de l'hôte en utilisant l'ip du conteneur en cours d'exécution.

Sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name/id

Test après avoir obtenu l'ip: Psql -h 172.17.0.2 -U postgres

0
Bogdan Costea

Je pense que le problème est que postgres est en cours d’exécution sur la machine locale, sur le port 5432 . Ce problème peut être résolu en mappant le port 5432 du conteneur de menu fixe sur un autre port de la machine hôte. .__ Ceci peut être réalisé en modifiant docker-compose.yml

Changement

"5432:5432" 

à 

"5433:5432"

Redémarrer Docker-Composer

Maintenant, le conteneur docker postgres s'exécute sur 5433. (Le postgres installé localement est sur 5432) Vous pouvez essayer de vous connecter au conteneur docker.

psql -p 5433 -d db_name -U user -h localhost
0
Sreeragh A R

Comme vous l’exécutez dans OSX, vous pouvez toujours utiliser l’application préinstallée Network Utility pour exécuter un Port Scan sur votre hôte et identifier si le serveur postgres est en cours d’exécution et si oui, sur quel port)} _. 

Mais je ne pense pas que vous en avez un sur votre hôte. Le problème est que Postgres s’exécute par défaut sur 5432 et que le fichier docker-compose que vous essayez d’exécuter expose le conteneur de base de données sur le même port, à savoir 5432. Si le serveur Postgres était déjà en cours d'exécution sur votre hôte, Docker aurait alors tenté d'exposer un conteneur à un port déjà utilisé, générant ainsi une erreur. 

Une autre solution potentielle:
Comme on peut le voir dans ce answer , mysql ouvre un socket Unix avec localhost et non un socket tcp. Peut-être que quelque chose de similaire se passe ici. 

Essayez d'utiliser 127.0.0.1 au lieu de localhost lors de la connexion au serveur dans le conteneur.

0
meshde