web-dev-qa-db-ja.com

ホストマシンからdockerコンテナのpostgresに接続する

ホストマシンからdockerのpostgresに接続するにはどうすればよいですか?

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

コンテナから正常に接続できます。アプリコンテナとdbコンテナの両方。

コンテナ内でpsqlを実行しているデータベースとユーザーのリスト:

# 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)

DBイメージは公式のpostgresイメージではありません。しかし、GitHubのDockerfileは見栄えが良いようです。

dBコンテナからのcat /var/lib/postgresql/data/pg_hba.conf:

# 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

両方のユーザーを運よく試してみました

$ 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

私のホストマシンでは、そのポートで既にPSQLが実行されているようです。どうすれば確認できますか?

11
mef_

これを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                                                  | {}

そして、私のMacからVM内でdockerが実行されていました(192.168.33.100はdocker VMのIPアドレスです))

$ 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                                                  | {}

両方とも私のために働いています。

VM上のPSQLバージョン

$ psql --version
psql (PostgreSQL) 9.5.13

MacのPSQLバージョン

$ psql --version
psql (PostgreSQL) 9.6.9

Working

3
Tarun Lalwani

問題は、ポート5432でローカルマシンでpostgresを実行していることだと思います。この問題は、Dockerコンテナのポート5432をホストマシンの別のポートにマッピングすることで解決できます。これは、docker-compose.ymlに変更を加えることで実現できます

変化する

"5432:5432" 

"5433:5432"

Docker-composeを再起動します

これで、Dockerコンテナーpostgresが5433で実行されます。(ローカルにインストールされたpostgresは5432にあります)dockerコンテナーへの接続を試すことができます。

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

pg_hba.confに問題があると思います。ここでは、アクセス権を持つ1つのホスト-127.0.0.1/32を指定しました。

これに変更できます:

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

これにより、ホスト(まったく異なるIP)が接続できるようになります。

実行中のpostgresqlのインスタンスがあるかどうかを確認するには、netstat -plnt | grep 5432を実行します。これから結果が得られたら、PIDを取得してプロセス自体を確認できます。

1
wadhg

しかし、postgres 10公式dockerコンテナーを実行しているときに、基本OS 5.0でも同じ問題が発生しました。実行中のコンテナーのIPを使用してホストから接続できました。

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

IPを取得した後のテスト:psql -h 172.17.0.2 -U postgres

0
Bogdan Costea

私は比較的似た設定をしており、ホストマシン上のpsqlセッションをdocker postgresインスタンスに開くために次のように動作します:docker-compose run --rm db psql -h db -U postgres -d app_development

どこ:

  • dbはコンテナの名前です
  • postgresはユーザーの名前です
  • app_developmentはデータベースの名前です

あなたにとっては、docker-compose run --rm appdb psql -h appdb -U www-data -d app_db

0
antislice

OSXで実行しているため、事前にインストールされたNetwork Utilityアプリを使用してを実行できますホストでポートスキャンを実行し、postgresサーバーが実行されているかどうかを特定します(そして、はいの場合、どのポートで)

しかし、ホスト上で実行されているとは思わない。問題は、Postgresがデフォルトで5432で実行され、実行しようとしているdocker-composeファイルが同じポート(つまり5432)のdbコンテナを公開することです。 Postgresサーバーが既にホストで実行されている場合、Dockerは既に使用されているポートにコンテナーを公開しようとしたため、エラーが発生しました。

別の可能な解決策:
この例でわかるように、 answermysqlは、tcpソケットではなく、localhostでUNIXソケットを開きます。ここで似たようなことが起こっているのかもしれません。

コンテナ内のサーバーに接続するときに、localhostの代わりに127.0.0.1を使用してみてください。

0
meshde