質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

253閲覧

「開発系エンジニアのためのDocker絵解き入門」秀和システム 鈴木亮著というテキストのP118ページについて

pg1965

総合スコア7

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2024/10/18 05:45

実現したいこと

Dockerの使い方に関して、不明点を明らかにしたい。

発生している問題・分からないこと

イメージ説明

テキストP118ページで、
$psql --host=127.0.0.1 --port=5432 --username=postgres
というコマンドがあります。

このコマンドで「PostSQLコンテナのPostgresSQLサーバーに接続」できることになっていて、実際に接続可能です。(事前にコンテナを作ってあります)。

わからないのは、docker container execなどのコマンドを前につけずに、psqlだけでなぜコンテナ内にコマンドを伝えられるかです。初歩的な質問で申し訳ありませんが、ご教示頂ければありがたく存じます。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

検索できなかったので、よろしくお願い致します。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mingos

2024/10/18 08:34

コンテナの外(ホスト)でこのコマンドを実行しているのであれば、 ホスト側にpsqlコマンドがインストールされている、 コンテナの5432ポートとホストの5432ポートがポートフォワーディングで紐づいている。 という事が考えられるのではないでしょうか。
pg1965

2024/10/18 15:19

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

回答2

0

psqlだけでなぜコンテナ内にコマンドを伝えられるかです。

まず、この状況ではpsqlコマンドはローカルで実行しています。

ローカルで実行したpsqlコマンドがDocker内のPostgreSQLサーバと通信しているだけです。

投稿2024/10/18 05:55

maisumakun

総合スコア145939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/10/18 05:57

ホストが「127.0.0.1」となっていますが、おそらくポートフォワードしてDocker内に接続されている状況と思われます。
pg1965

2024/10/18 15:20

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

0

ベストアンサー

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につながるようになります。

説明は以上です。これで、

投稿2024/10/18 09:51

TakaiY

総合スコア13687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pg1965

2024/10/18 15:18

詳しい説明をありがとうございました。現在消化できない内容もありますが、要点は理解できました。たくさんのお時間を割いて頂き、感謝ししています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問