2016-03-10 20 views
12

Dockerコンテナを使用してPostgreSQLサーバを実行し、ホストマシンから接続しようとしています。PostgreSQL 9.1用のDockerコンテナがホストにポート5432を公開していない

私の設定は次のとおりです。

  • ホスト・マシン:MacのOS X 10.10.5
  • ドッカー1.10.1

私はこれをやった:

ステップ1 :永久ポストグルデータ用のボリュームを作成する

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 

は、ステップ3コンテナを実行しているとき、私はポートマッピングを指定これを行うことによって:

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' 

Bu私はそのインスタンスに接続したいと思っています:

psql -h localhost -p 5432 -U postgres 

私はホストマシンにローカルにPostgresをインストールしたのと同じです。

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

sudo lsof -i -P | grep -i "listen" - >何のポート5432オープン

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

ストップドッカー。その後、私のホストマシンに普通のPostgreSQL 9.4.4のインスタンスを実行します(ここに関係するドッカーはなく、Mac OS Xホストではpostgresが実行され、ポート5432でリッスンします)。すべてが正常です:

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

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

私は何の問題もなく私の地元のpostgresインスタンスに接続することができます(コマンドの出力を見て:postgresのは、Mac OS X、私のホスト用にコンパイルされます):

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) 

今楽しい部分。ホストのPostgreSQLインスタンスが実行されている間に、私はDockerインスタンスをもう一度起動します。

開始! (それはしないでください)。私は今)(選択したバージョンを実行している場合は、私も

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' 

...ドッキングウィンドウの実行を使用して接続することができ、はそれが同じ時間のpostgresで私のドッキングウィンドウのインスタンス内で実行されているPostgresがドッキングウィンドウの外に、私のホストで実行されている示し、同じ5432ポートを使用してください。(ouputを見て、Postgresのは、Debian、Postgresの内部のOS用にコンパイルさ:9.1コンテナ)

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) 

なぜ?

意味がありますか?私の最終的な目標はで、別のDockerコンテナでDjangoアプリケーションを実行し、Postgresインスタンスと接続することです。どうすればいい?

答えて

7

実行-p <host_port>:<container_port>を使用して正しいポートマッピングとpostgreの画像:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1 
+0

ありがとうございます!私はそれをやった。しかし、まだpsqlを使って接続することはできません。ポート5432が公開されていないか、または接続方法がわかりません。ホストのpsqlプログラムが正常に動作しています(他のホストに接続できますが、コンテナには接続できません) – jorgeas80

+0

'docker port 'とは何ですか? –

+0

'5432/tcp - > 0.0.0.0:5432' –

6

あなたのドッキングウィンドウのホストはそれ自身のIP adddresを持つ仮想マシンです。 次のコマンドを入力して、このIPアドレスを検出することができます。

docker-machine ip 

あなたは-p 5432使用してポートをマッピングしたときの答えが192.168.99.100

のようになります:5432スイッチを、上記のIPアドレスを使ってあなたのdevマシンのツールでpostgresに接続することができます。

2

それは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

+0

私のために固定、ありがとう! – PepeHands

関連する問題