Docker Composeとネットワークの基礎を理解しよう

前回までは、Docker Composeを使ったサービス構築と、ボリュームによるデータ永続化の基本を紹介しました。

今回は、コンテナ間通信の中核を担う Dockerネットワーク に焦点を当てて、Docker Composeを使ったネットワーク定義の方法やその活用例を解説します。

Contents

  1. Dockerネットワークの基本とは?
  2. Docker Composeでネットワークを定義する
  3. defaultネットワークとcustomネットワークの違い
  4. 仮想ブリッジの仕組み
  5. コンテナ間通信の確認方法

Dockerネットワークの基本とは?

Dockerでは、コンテナ同士を通信させるための「ネットワーク」機能が標準で備わっています。特にDocker Composeでは、定義したサービスが自動的に同一ネットワークに属するため、サービス名で名前解決が可能です。

たとえば以下のように、nginxからphpサービスへ通信したいときは、php:9000 のように書くだけでOKです。

Docker Composeでネットワークを定義する

Composeでは、カスタムネットワークを明示的に定義して分離した構成も可能です:

そして、サービスごとにネットワークを割り当てることで、柔軟な通信制御ができます:
docker-compose.ymlファイルの例

このようにネットワークを分けることで、外部に公開するサービスと内部専用のサービスを切り分けることができます。

ネットワークを分ける主なメリットは以下の通りです:

  • セキュリティの向上: 内部用サービス(DBなど)を外部ネットワークから隔離することで、不要なアクセスを防げます。
  • 構成の明確化: フロントエンド・バックエンドなど機能ごとにネットワークを分けることで、構成が視覚的にも論理的にもわかりやすくなります。
  • 障害の切り分け: 通信エラーや依存性トラブルが発生した場合に、どのレイヤーのネットワークに問題があるのかを見極めやすくなります。
  • スケーラビリティ: マイクロサービス構成で各サービスが独立していても、ネットワークで柔軟にグルーピングできます。

以下のように視覚的に整理すると、ネットワーク構成の理解がより深まります。

と書きましたが、ローカルの環境だけでいえば、正直そこまで意識せずとも動けば良いとは思います。
ただし、ローカルで構築したものを、そのままサーバで動かすという場合には、あらかじめネットワークを意識しての構築は必須と言えます。

defaultネットワークとcustomネットワークの違い

Docker Composeを使うと、明示的に定義しなくても「default」という名前のネットワークが自動生成され、全サービスがその中に所属します。

一方、カスタムネットワークを使うことで、複数のComposeファイル間の接続や通信制限(ファイアウォール的な役割)を行うことができるため、開発・運用フェーズで役立ちます。

仮想ブリッジの仕組み

Dockerのネットワーク機能の中心には 仮想ブリッジ(bridge network) があります。

これは、ホストマシン上に作られる仮想的なスイッチのようなもので、すべてのコンテナはこの仮想ブリッジに接続され、コンテナ間の通信が可能になります。

通常、docker0 という名前の仮想ブリッジが自動的に作成されます。コンテナはこのブリッジに接続され、それぞれにプライベートIPアドレスが割り当てられ、名前解決も行われます。

Docker Composeで custom network を定義すると、docker0 とは別の名前で仮想ブリッジが作成されます。この構成により、より柔軟でセキュアなネットワーク設計が可能になります。

コンテナ間通信の確認方法

Docker Composeを使って複数のコンテナを立ち上げた場合、それらが同じネットワークに属していれば、サービス名を使って通信できるのが大きな特徴です。

ここでは、nginx → php → db のように、コンテナ同士の通信ができるかを確認してみましょう。

① まずはコンテナ内に入る

ターミナルで、対象のコンテナにログインするには以下のコマンドを使います:

たとえば、nginxコンテナに入るなら:

※ Alpine Linuxなど一部の軽量コンテナでは /bin/sh を使う必要がある場合があります。

 

② コンテナ内から通信確認する

実際に通信できるかどうかは、コンテナ内にログインしてコマンドを使って確認するのが確実です。
そのために、docker-compose.yml では container_name を明示的に設定しておくと、ログインや通信先の指定がわかりやすくなります。

上記のように設定した前提で、通信確認の手順を以下に示します。

🔸 nginx(my_web)からPHP(my_php)に ping
🔸 PHP(my_php)からMySQL(my_db)に curl

ここで使用している my_phpmy_dbdocker-compose.yml の container_name に指定した名前です。
コンテナ間で同じネットワーク上にある場合、このように名前で通信できます。

 

③ web → db は直接通信できない

この例では、web(nginx)は frontend ネットワーク、db(MySQL)は backend ネットワークに属しており、共通ネットワークに接続されていない構成になっています。

そのため、nginx から db へは通信が届きません。これはセキュリティ上の観点からも望ましい構成です。

以下は、my_web コンテナにログインし、my_db への通信を試みる例です。

このように、異なるネットワークに属している場合は、名前解決や通信が行えません
これはネットワーク分離が正しく働いている証拠であり、外部公開すべきでないサービス(例:DB)を保護する有効な方法です。

 

④ 通信成功の確認とトラブル時の対処

  • pingで応答が返ってくれば通信成功です(ただしpingが無効なイメージもあります)
  • curlでポートが開いているか確認できます(MySQLなど)

もし通信できない場合は以下を確認してみてください:

  • networks: 設定で同じネットワークに属しているか
  • サービス名のスペルミスがないか
  • 対象のサービスが起動しているか、ログにエラーが出ていないか

docker network lsで確認してみよう

Docker Composeでネットワークを定義し、コンテナを起動すると、次のようにdocker network lsコマンドでネットワーク一覧を確認できます:

myproject_から始まる名前は、Composeファイル名(myproject.ymlなど)から自動生成されたネットワーク名です。

まとめ

Docker Composeでは、ネットワークの知識があるとさらに柔軟で安全な環境を構築できます。

  • defaultネットワーク:基本的な使い方に便利
  • customネットワーク:開発/本番環境での分離や接続制御に最適
  • 仮想ブリッジ:コンテナ同士の通信を内部的に制御する基盤

次回は、実際のプロジェクトでネットワーク設計をどう使うかの応用例やTipsを紹介する予定です!

 
 

ブログランキングに参加しています。クリックして応援していただけると嬉しいです。

人気ブログランキング
ブログランキング・にほんブログ村へ
にほんブログ村