web-dev-qa-db-ja.com

Postgres 9.1のDockerコンテナがポート5432をホストに公開しない

Dockerコンテナを使用してPostgreSQLサーバーを実行し、ホストマシンから接続しようとしています。

私の構成は次のとおりです。

  • ホストマシン:Mac OS X 10.10.5
  • Docker 1.10.1

私はこれをやった:

ステップ1:永続的なpostgresデータ用のボリュームを作成します

docker volume create --name postgres_data

ステップ2:postgresインスタンスを開始します

[〜#〜] update [〜#〜]:コメントで示唆されているように、コンテナの実行時にポートマッピングを指定しました

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1

ステップ:これを実行してDockerインスタンスに接続します:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

ただし、次の方法でそのインスタンスに接続したいだけです。

psql -h localhost -p 5432 -U postgres

ホストマシンにPostgresをローカルにインストールした場合のように。

問題はポート5432が公開されていないです。だから、私はそれに接続することはできません:

Sudo lsof -i -P | grep -i "listen"->ポート5432が開いていません

PDATE 2:見知らぬ人でも。私もこれをやった:

Dockerを停止します。次に、通常のPostgreSQL 9.4.4インスタンスを実行します私のホストマシンで(ここにはdockerは関係ありません。MacOS Xホストで実行され、ポート5432でリッスンします)。すべてが正常です:

Sudo lsof -i -P | grep -i "postgres"

postgres  14100          jorge    6u  IPv4 0x780274158cebef01      0t0  TCP localhost:5432 (LISTEN)

ローカルpostgresインスタンスに問題なく接続できます(コマンドの出力を見てください:Mac OS X用にコンパイルされたpostgresはホストです)。

psql -h localhost -U postgres -c "select version()"
                                                                version
---------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.4.4 on x86_64-Apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit
(1 row)

今から楽しい部分です。 Dockerインスタンスを再起動しますホストPostgreSQLインスタンスの実行中

始まる! (そして、そうすべきではありません)。 docker runを使用して接続することもできます...

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

今すぐselect version()を実行すると、同じ5432ポートを使用して、Docker以外のホストでpostgresが実行されているのと同時に、dockerインスタンス内で実行されているpostgresが表示されます。 (出力を見ると、postgres:9.1コンテナ内のOSであるDebian用にコンパイルされたpostgresです)

postgres=# select version();
                                            version
------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 row)

どうして?

理にかなっていますか?私の最終目標はDjango別のDockerコンテナでアプリを実行し、Postgresインスタンスに接続するです。どうすればできますか?

28
Jorge Arévalo

それは2018年であり、同様の問題がありました。私にとっての解決策は、ドッカーへの小道具の順序であるように見えました。例えばこれにより、ポートが公開されなくなりました。

docker run -d --name posttest postgres:Alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

これは正常に機能しました(イメージはポート5432を期待どおりに露出しました)。

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:Alpine

41
MrGreg

-p <Host_port>:<container_port>を使用して、正しいポートマッピングでpostgreイメージを実行します。

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1
9
Ali Dehghani

Dockerホストは仮想マシンであり、独自のIPアドレスを持っています。次のコマンドを入力して、このIPアドレスを検出できます。

docker-machine ip

答えは192.168.99.1のようになります

-p 5432:5432スイッチを使用してポートをマッピングしたら、記載されているIPアドレスを使用して、開発マシンの任意のツールでpostgresに接続できます。

7
Marcel Posdijk

同様の問題がありました。私の問題は、ローカルホストにマッピングしない0.0.0.0でしたので、psqlに追加するだけでした

psql --Host=0.0.0.0

これは推定です

docker port <container name>

出力

5432/tcp -> 0.0.0.0:5432
2
Alex Spera

Localhost(127.0.0.1)を除き、コンテナIPまたはホストIPを使用して接続できました。

コンテナIDを取得するには

docker ps

必要なコンテナIDを見つけて実行する

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>

ポートを公開する必要があります。

次に、2つのコンテナーpostgresとadminerを起動するdocker-compose.ymlの例を示します。adminerは、postgresへの接続に使用できるデータベース管理ツールです。

version: '3'
services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
  postgres:
    image: postgres:11.4-Alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
2
Roman_K