Docker | 2週間で実務レベルに到達するDocker学習:Docker Compose入門 - Day8

Docker Docker
スポンサーリンク

Day8:Docker Compose入門 中盤

テーマ:Web と DB が“どうやってつながるのか”を理解し、Compose の本当の便利さを体感する

中盤では、前半で学んだ
「Compose は複数コンテナをまとめる設計図」
という感覚をさらに深めていきます。

特に重要なのは、
Web コンテナと DB コンテナがどうやって通信するのか
という部分です。

ここを理解すると、あなたは
「Web + DB の本物のアプリ構成」を Docker で再現できるエンジニア
になります。


Web と DB は“Compose が作る専用ネットワーク”でつながる

Compose は自動でネットワークを作る

docker-compose.yml に複数のサービスを書いた瞬間、
Compose は裏側で 専用ネットワーク を作ります。

このネットワークの中では、
サービス名がそのままホスト名として使える
というのが最大のポイントです。

つまり、Web コンテナから DB コンテナに接続するとき、
localhost ではなく db と書きます。


Web から DB への接続例(Node.js)

Node.js の MySQL 接続コード

const mysql = require("mysql2");

const connection = mysql.createConnection({
  host: "db",          // ← ここが Compose の魔法
  user: "root",
  password: "password",
  database: "myapp"
});
JavaScript

ここで host: "db" と書いているのは、
Compose の services に書いた db というサービス名です。

Compose が自動でネットワークを作り、
そのネットワーク内で db という名前のコンテナを見つけてくれる のです。

重要ポイント

  • Web と DB は同じネットワークにいる
  • サービス名=ホスト名
  • IP アドレスを覚える必要はない
  • 設定がシンプルでミスが減る

これが Compose の最大のメリットの1つです。


Web と DB の起動順はどうなるのか

Compose は依存関係を理解して動く

Web は DB が起動していないと動かないことが多いです。

Compose では、
depends_on を使って起動順を指定できます。

例:

services:
  web:
    build: .
    depends_on:
      - db
YAML

これで、
「web は db が先に起動してから動く」
という流れになります。

ただし注意

depends_on は「起動順」を保証するだけで、
「DB が完全に準備できたか」は保証しません。

本番ではヘルスチェックを使いますが、
Day8 の段階ではここまで理解できていれば十分です。


Web と DB が“1つのアプリ”として動くイメージ

docker compose up の裏側で起きていること

あなたが次のコマンドを実行すると、

docker compose up

Compose は次のことを自動で行います。

  1. Web 用の Dockerfile をビルド
  2. MySQL イメージを取得
  3. 専用ネットワークを作成
  4. DB コンテナを起動
  5. Web コンテナを起動
  6. Web が DB に接続できるようにする

あなたは 1コマンド しか打っていませんが、
Compose は裏側で 6つ以上の作業 を自動化しています。

これが「複数コンテナ管理」の本質です。


Web と DB のログを個別に確認できる

Web のログを見る

docker compose logs web

DB のログを見る

docker compose logs db

複数コンテナ構成でも、
サービス名を指定するだけでログを見られます。


コンテナ間通信の“つまずきポイント”を深掘りする

よくある間違い:host を localhost にする

初心者が必ずやるミスです。

host: "localhost"
JavaScript

これは Web コンテナの中の localhost を指すため、
DB にはつながりません。

正しくは:

host: "db"
JavaScript

Compose のサービス名を使うのが正解です。

もう1つのミス:ポート番号の勘違い

DB コンテナの内部ポートは 3306 ですが、
Compose 内の通信ではポート公開は不要です。

つまり、
Web → DB の通信に ports: は不要
ということです。


中盤まとめ

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

  • Compose は Web と DB を同じネットワークに入れる
  • サービス名(web / db)がそのままホスト名になる
  • Web から DB へは host: “db” で接続する
  • depends_on で起動順を制御できる
  • docker compose up で複数コンテナが一括起動
  • localhost を使うと接続できない(初心者の落とし穴)
タイトルとURLをコピーしました