Day10:ネットワーク理解(後半)
テーマ:localhost を完全に卒業し、“実務レベルのコンテナ間ネットワーク設計”を理解する
後半では、前半・中盤で学んだ
「コンテナ同士は service名でつなぐ」
という基礎をさらに発展させ、
実務で必須となる “localhost に依存しないネットワーク設計” を深掘りします。
ここを理解すると、あなたは
「どんな環境でも動くコンテナ構成を作れるエンジニア」
に一歩進みます。
localhost を使わない設計がなぜ重要なのか
localhost は「コンテナ自身」を指すため、複数コンテナ構成では破綻する
アプリが DB に接続するとき、localhost を使ってしまうと、
アプリが動いているコンテナ自身を指してしまう
という問題が起きます。
web コンテナ → localhost
→ web コンテナ自身
→ DB には絶対に届かない
これは Docker 初心者が最もハマるポイントです。
service名を使うと環境差異が完全に消える
開発環境
本番環境
CI/CD
クラウド(ECS / Kubernetes)
どこでも同じように動くアプリを作るには、
「ホスト名を固定できる」 ことが重要です。
service名は Docker Compose が保証する“固定ホスト名”なので、
環境が変わっても壊れません。
実務でよくある「web → api → db」の3段構成を例にする
docker-compose.yml の例(実務に近い構成)
version: "3"
services:
web:
build: ./web
ports:
- "3000:3000"
environment:
API_URL: http://api:4000
depends_on:
- api
api:
build: ./api
environment:
DB_HOST: db
DB_USER: user
DB_PASSWORD: pass
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: myapp
YAMLここで重要なポイント
web → api
→ API_URL=http://api:4000
api → db
→ DB_HOST=db
どちらも localhost を使っていない。
すべて service名で接続している。
これが「localhost に依存しない設計」です。
service名で接続することで得られる“実務的メリット”
1. コンテナの IP が変わっても壊れない
コンテナは再起動するたびに IP が変わることがあります。
IP を直書きすると即破綻します。
service名は固定なので、
再起動しても、スケールしても、IP が変わっても壊れない。
2. スケールアウトに対応できる
api を 3 台に増やした場合でも、
web は api という名前に投げれば、
Docker が自動で負荷分散してくれます。
これは Kubernetes に近い動き です。
3. 本番環境への移行がスムーズ
本番では DB が別サーバにあることが多いですが、
環境変数だけ変えれば対応できます。
開発:DB_HOST=db
本番:DB_HOST=prod-db.internal
コードは一切変更不要。
ネットワークを分けるとさらに安全になる(実務レベル)
frontend と backend を分離する例
services:
web:
networks:
- frontend
- backend
api:
networks:
- backend
db:
networks:
- backend
networks:
frontend:
backend:
何が起きているか
web は外部公開されるので frontend にも backend にも所属
api と db は backend のみ
つまり、
外部から api や db に直接アクセスできない安全な構成
が作れます。
これは実務で必須のセキュリティ設計です。
localhost を使わない設計の“完成イメージ”
あなたが目指すべき構造
web → api → db
↑ ↑
localhost は使わない
service名で接続する
web から api へ:http://api:4000
api から db へ:host: "db"
この構造を作れるようになれば、
あなたは Docker ネットワークの本質を理解しています。
Day10 後半のゴール達成チェック
あなたは次の質問に答えられますか。
コンテナから見た localhost の意味は?
service名で接続できる理由は?
web → api → db の接続を service名で書ける?
IP ではなく service名を使うメリットは?
ネットワークを分けると何が安全になる?
これらを自分の言葉で説明できれば、
Day10 のゴール「localhost に依存しない設計」は完全達成です。

