docker container execなどのコマンドを前につけずに、psqlだけでなぜコンテナ内にコマンドを伝えられるか
PostgreSQLについて
PostgreSQLなどのデータベースは、ネットワーク経由でアクセスしてくることを前提にしくみが作られています。なので、 10.0.0.100というIPのサーバにPostgreSQLがインストールされていれば、10.0.0.100のマシンのポート5432にアクセスすると、そのPostgreSQLに接続できます。
psqlコマンドについて
psqlコマンドは、ネットワーク経由でPostgreSQLに接続するためのコマンドです。決してPostgreSQLがインストールされたマシンで直接実行して接続するためのものではありません。
上記の状態で、10.0.0.200のIPを持つマシンから、psqlで接続するには
shell
1$ psql --host=10.0.0.100 --port=5432 --username=postgres
というコマンドを実行します。
ループバックアドレスについて
ネットワークでの操作で、自分自信を表わすアドレスであるループバックアドレスというものが定義されていて、127.0.0.1(他の値もある)をつかうことができます。
さきほどのPostgreSQLで、10.0.0.100のマシンで、 同一マシン上に動いているPostgreSQLにつなぐには、先の例と同様
shell
1$ psql --host=10.0.0.100 --port=5432 --username=postgres
としてもいいですが、ループバックアドレスを使うこともできます。
shell
1$ psql --host=127.0.0.1 --port=5432 --username=postgres
ループバックアドレスを使った表記でば、実行するマシンによって接続先が異なりますが、「作業中のマシンで動作しているサービスにつなぎたい」という場合には便利につかえる値です。
dockerのネットワーク
dockerのコンテナはdockerの動いているマシン内に作られた固有のネットワークに接続しています。そのネットワークを使えば、ホストマシンからdockerのコンテナにアクセスすることができます
しかし、そのネットワークは、ホストのマシンが外部と繋っているネットワークとはきりはなされていますので、通常は外部からDockerコンテナにあるサービスにアクセスすることはできません。
dockerポートマッピング
dockerには、コンテナのポートをホストマシンのポートに接続する、ポートマッピングという仕組みがあります。
コンテナのポートをホストマシンのポートにつないで、そこからアクセスできるようにする仕組みです。
方法はいろいろありますが、コンテナの起動時に
shell
1docker run --name postgresql -p 5432:5432 postgresql
のようにすれば、ホストのポート5432にアクセスすると、コンテナのポート5432につながるようになります。
説明は以上です。これで、