Docker | 2週間で実務レベルに到達するDocker学習:ネットワーク理解 - Day10

Docker Docker
スポンサーリンク

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 に依存しない設計」は完全達成です。

タイトルとURLをコピーしました