1. ホーム
  2. ウブントゥ

[解決済み】Docker コンテナからローカル/ホストの postgres データベースに接続できるようにする。

2022-04-10 04:01:30

質問

最近、DockerとQGISで遊んでいて、以下の説明に従ってコンテナをインストールしました。 このチュートリアル .

GISデータを格納しているローカルホストのpostgresデータベースに接続できないのですが、すべて問題なく動作しています。これは、私のpostgresデータベースがリモート接続を受け入れるように設定されていないためだと考えています。 この記事 .

DockerでQGISを動かしているデータベースに接続しようとすると、could not connect to server.というエラーメッセージが表示されたままです。 Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433? postgres サーバーは稼働していますし、私の編集した pg_hba.conf ファイルで、IP アドレスの範囲 (172.17.0.0/32) からの接続を許可しています。以前、DockerコンテナのIPアドレスを問い合わせるのに docker ps で、IPアドレスは変化するものの、今のところ常に172.17.0.xの範囲にあります。

なぜこのデータベースに接続できないのか、何か思い当たることはありますか?おそらく、とても簡単なことだと想像しています。

Ubuntu 14.04; Postgres 9.3 を使用しています。

解決方法を教えてください。

TL;DR

  1. 使用方法 172.17.0.0/16 ではなく、IPアドレスの範囲として 172.17.0.0/32 .
  2. を使用しないでください。 localhost を使用してホストのPostgreSQLデータベースに接続し、代わりにホストのIPを使用します。コンテナの移植性を保つために、コンテナを起動する際に --add-host=database:<host-ip> フラグを使用し database をPostgreSQLに接続するためのホスト名として使用します。
  3. のみならず、すべてのIPアドレスで接続をリッスンするようにPostgreSQLが設定されていることを確認してください。 localhost . 設定を探します。 listen_addresses は、PostgreSQLの設定ファイルの中で、通常 /etc/postgresql/9.3/main/postgresql.conf (クレジット: @DazmoNorton).

ロングバージョン

172.17.0.0/32 範囲 のIPアドレスではなく、1つのアドレス(namly 172.17.0.0 ). このアドレスはDockerブリッジのネットワークアドレスであるため、どのDockerコンテナにも割り当てられることはありません( docker0 ) インターフェイスを使用します。

Dockerが起動すると、新しいブリッジネットワークインターフェイスが作成されます。 ip a :

$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever

ご覧の通り、私の場合は docker0 インターフェースには、IPアドレス 172.17.42.1 で、ネットマスクは /16 (または 255.255.0.0 ). これは、ネットワークアドレスが 172.17.0.0/16 .

IPアドレスはランダムに割り当てられますが、追加の設定をしなければ、常に 172.17.0.0/16 ネットワークに接続します。各Dockerコンテナに対して、その範囲からランダムなアドレスが割り当てられます。

つまり、データベースにアクセスできるすべてのコンテナからのアクセスを許可したい場合は 172.17.0.0/16 .