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依存や環境差異を完全に排除できる。

