ホストマシンから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が実行されているようです。どうすれば確認できますか?
これを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
問題は、ポート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
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を取得してプロセス自体を確認できます。
しかし、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
私は比較的似た設定をしており、ホストマシン上の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
。
OSXで実行しているため、事前にインストールされたNetwork Utilityアプリを使用してを実行できますホストでポートスキャンを実行し、postgresサーバーが実行されているかどうかを特定します(そして、はいの場合、どのポートで)。
しかし、ホスト上で実行されているとは思わない。問題は、Postgresがデフォルトで
5432
で実行され、実行しようとしているdocker-compose
ファイルが同じポート(つまり5432
)のdbコンテナを公開することです。 Postgresサーバーが既にホストで実行されている場合、Dockerは既に使用されているポートにコンテナーを公開しようとしたため、エラーが発生しました。
別の可能な解決策:
この例でわかるように、 answer 、mysql
は、tcpソケットではなく、localhost
でUNIXソケットを開きます。ここで似たようなことが起こっているのかもしれません。
コンテナ内のサーバーに接続するときに、localhost
の代わりに127.0.0.1
を使用してみてください。