Day10:ネットワーク理解(前半)
テーマ:まず「localhostの正体」と「コンテナ同士のつながり方」を腹落ちさせる
Day10 の前半では、
コンテナ間通信と service 名での接続に入る前提として、
「localhostって本当は何なのか」「コンテナから見た世界はどうなっているのか」
をかみ砕いて理解することをゴールにします。
ここを曖昧にしたまま進むと、
「つながらない」「localhostで動くはずなのに…」という泥沼にハマります。
逆に言えば、今日の前半が腑に落ちれば、ネットワークの半分はもう勝ちです。
localhostの正体をちゃんと理解する
localhostは「自分自身」であって「同じPC」ではない
まず一番大事なことからいきます。localhost は「今このプログラムが動いている“そのマシン自身”」を指します。
あなたのPCでブラウザを開いて http://localhost:8080 にアクセスするとき、
それは「あなたのPC自身の8080番ポート」に話しかけています。
ここまではイメージしやすいと思います。
ややこしくなるのは「コンテナの中から見た localhost」です。
コンテナの中から見た localhost は「そのコンテナ自身」
コンテナの中で動いているアプリが localhost に接続しようとすると、
それは「そのコンテナ自身」を指します。
つまり、こういうことです。
あなたのPCから見た localhost
→ あなたのPC
webコンテナから見た localhost
→ webコンテナ自身
dbコンテナから見た localhost
→ dbコンテナ自身
ここでよく起きる事故がこれです。
「DBコンテナに接続したいから、アプリの設定を host: "localhost" にした」
→ 実際には「アプリが動いているコンテナ自身」を見に行ってしまい、DBには絶対届かない。
この勘違いが、
「コンテナからDBにつながらない問題」のほぼ元凶 です。
Dockerの世界では「コンテナは別々の小さなマシン」
コンテナはそれぞれ独立した“ミニPC”
Dockerコンテナは、
それぞれが独立した小さなマシンのように振る舞います。
webコンテナ
dbコンテナ
redisコンテナ
見た目は同じPCの中で動いているように見えますが、
ネットワーク的には 別々のマシン として扱われます。
だからこそ、
「web から db にどうやって話しかけるか」
をちゃんと設計する必要が出てきます。
コンテナ間通信の基本イメージ
「ホスト ↔ コンテナ」と「コンテナ ↔ コンテナ」は別物
Day3 でやったのは主に「ホスト ↔ コンテナ」の話でした。
ホストの 8080 番 → コンテナの 80 番-p 8080:80 で橋を作る
ブラウザから localhost:8080 でアクセス
これは「あなたのPCからコンテナにアクセスする」話です。
Day10 で扱うのは、
「コンテナ ↔ コンテナ」の通信 です。
webコンテナ → dbコンテナ
apiコンテナ → redisコンテナ
このときには、localhost ではなく 「相手コンテナの“名前”」 を使うのがポイントになります。
Docker Composeが作る“コンテナ同士の世界”
Composeを使うと、コンテナは同じ“仮想ネットワーク”に入る
Docker Compose を使って docker compose up(または docker-compose up)すると、
裏側で そのプロジェクト専用のネットワーク が自動で作られます。
そのネットワークの中に、
web サービスのコンテナ
db サービスのコンテナ
が一緒に参加します。
この「同じネットワークにいる」という状態が、
コンテナ間通信の前提条件 です。
同じネットワークにいるコンテナ同士は、
service名でお互いを呼び出せる ようになります。
前半のゴールを言語化しておく
ここまでの前半で、あなたに持っていてほしい感覚はこれです。
localhost は「今動いているそのマシン自身」であり、コンテナごとに意味が違う。
コンテナはそれぞれ独立した“ミニPC”として扱われる。
ホスト ↔ コンテナ と コンテナ ↔ コンテナ の通信は別物。
コンテナ同士をつなぐには、同じDockerネットワークに参加させる必要がある。
この土台ができていれば、
中盤で扱う 「service名で接続する」「localhostに依存しない設計」 が
スッと入ってきます。

