問題発生までの過程
postgresコンテナを下記コマンドで起動した。
docker run --name some-postgres -e POSTGRES_PASSWORD=password -d postgres
次にpsqlコマンドでコンテナ内のDBに下記のようにアクセスしたが、接続できなかった。
psql -h localhost -p 5432 -U postgres
----結果----
psql: エラー: "172.17.0.2"、ポート5432のサーバーへの接続に失敗しました: Operation timed out
サーバーはそのホスト上で稼働していてTCP/IP接続を受け付けていますか?
postgresでは...
ユーザー名を指定しなければ、デフォルトユーザー名がpostgresとなる。
DB名を指定しなければ、DB名がユーザー名と同じになる(今回はユーザー名も指定してないので、postgresとなる)
ポート番号を指定しなければ、デフォルトポートが5432となる。
解決
docker run
のときに、ポートを指定していなかったから。
こう起動すべきだった。
docker run --name postgres-container -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres
原因究明まで
docker inspect postgres-container
----結果----
~~~
"NetworkSettings": {
"Bridge": "",
"SandboxID": "612d99cf70a9e6e694bc5987de054318c03188c629bc293e4b7c5e1617b74b29",
"SandboxKey": "/var/run/docker/netns/612d99cf70a9",
"Ports": {
"5432/tcp": null
},
~~~
ネットワークなどに詳しくはないが、この"Ports": { "5432/tcp": null },
がnullとなっているのが変だと感じた。
で、コンテナ起動時に-p 5432:5432
とポートマッピングしてやると
"Ports": { "5432/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "5432" } ] },
となった。
docker runでポートマッピングをしない場合は、デフォルトでホストの5432ポートとマッピングされるものだと思っていたがそうではなかったようです。
ホストからアクセスしたい場合は、マッピングを省略しないようにします。