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

Docker Docker
スポンサーリンク

Day10:ネットワーク理解(中盤)

テーマ:コンテナ同士を “service名でつなぐ” を実際に体験し、localhost を卒業する

中盤では、前半で理解した
「localhost はコンテナごとに意味が違う」
という前提を踏まえて、
実際に web → db のようなコンテナ間通信を行う仕組みを、
Docker Compose を使って“手を動かすようにイメージできるレベル”まで深掘りします。

ここが理解できると、あなたは 「コンテナ同士を正しくつなげる人」 になれます。


コンテナ間通信の本質は「名前解決(DNS)」にある

service名で接続できる理由

Docker Compose は、
同じ docker-compose.yml に書かれたサービス同士を
同じ仮想ネットワークに自動で参加させます。

そして、そのネットワーク内では
サービス名がそのままホスト名(DNS名)として使える
ようになります。

つまり、web コンテナから db コンテナに接続したいとき、
host: "db" と書けば届くのは、
Docker が内部で DNS を用意しているからです。

これは「Docker Compose の魔法」と言われるほど便利な仕組みです。


実例:web → db を service名で接続する Compose ファイル

docker-compose.yml の例

Node.js(web)と MySQL(db)をつなぐ例を見てみましょう。

version: "3"

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_USER: myuser
      DB_PASSWORD: password
      DB_NAME: myapp
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp
YAML

ここで重要なのは DB_HOST: db です。

web コンテナから見たとき、
db という名前は db サービスのコンテナを指すホスト名 になります。

つまりこういうこと

web → 「DBどこ?」
Docker → 「db という名前のコンテナがあるよ」
web → 「じゃあ db に接続するね」

これが service名で接続する という仕組みです。


Node.js 側の接続コードも service名を使う

Node.js の接続例

const mysql = require("mysql2");

const connection = mysql.createConnection({
  host: process.env.DB_HOST,   // "db"
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
});
JavaScript

ここで host: "localhost" と書いてしまうと、
web コンテナ自身を指してしまい、
絶対に DB には届きません。

だからこそ、
localhost に依存しない設計
が重要なのです。


service名で接続するメリットを深掘りする

1. IPアドレスに依存しない

コンテナの IP は起動のたびに変わることがあります。
IP を直書きすると、毎回調べ直す必要があり、実務では破綻します。

service名なら固定です。
web → db
これは永遠に変わりません。

2. 環境ごとに設定を切り替えやすい

開発環境では

DB_HOST=db

本番環境では

DB_HOST=prod-db.internal

のように、環境変数だけ変えれば OK。
コードは一切変更しない。

これが「移植性の高いアプリ」の条件です。

3. localhost の誤解によるトラブルを完全に防げる

初心者が最もハマるのは
「コンテナから localhost で DB に接続しようとして失敗する」
という問題です。

service名を使えば、この問題は完全に消えます。


コンテナ間通信のイメージを“図”で理解する

ホスト ↔ web ↔ db の関係

あなたのPC(ホスト)
   ↓ localhost:3000
webコンテナ(3000番で待機)
   ↓ host: "db"
dbコンテナ(MySQL)

ここで重要なのは、
web → db の通信には localhost は一切登場しない
という点です。

web コンテナから見た localhost は web 自身だからです。


中盤のゴールを言語化しておく

あなたがここまで理解できていれば、中盤はクリアです。

コンテナ間通信は「同じネットワークにいること」が前提。
Docker Compose は自動で専用ネットワークを作る。
そのネットワーク内では service名がホスト名として使える。
web → db の接続は host: “db” と書く。
localhost はコンテナ自身を指すため、コンテナ間通信には使えない。
service名を使うことで、IP依存や環境差異を完全に排除できる。

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