Dockerコンテナを使用してPostgreSQLサーバーを実行し、ホストマシンから接続しようとしています。
私の構成は次のとおりです。
私はこれをやった:
ステップ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インスタンスに接続するです。どうすればできますか?
それは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
-p <Host_port>:<container_port>
を使用して、正しいポートマッピングでpostgreイメージを実行します。
docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1
Dockerホストは仮想マシンであり、独自のIPアドレスを持っています。次のコマンドを入力して、このIPアドレスを検出できます。
docker-machine ip
答えは192.168.99.1のようになります
-p 5432:5432スイッチを使用してポートをマッピングしたら、記載されているIPアドレスを使用して、開発マシンの任意のツールでpostgresに接続できます。
同様の問題がありました。私の問題は、ローカルホストにマッピングしない0.0.0.0でしたので、psqlに追加するだけでした
psql --Host=0.0.0.0
これは推定です
docker port <container name>
出力
5432/tcp -> 0.0.0.0:5432
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