Docker Composeでネットワークを定義する方法:コンテナ間通信を理解する

Docker Composeを使えば、複数のコンテナをまとめて管理でき、アプリケーションの開発やテスト環境を効率的に構築できます。その中でも「ネットワーク設定」は、コンテナ間通信を安全かつ明確にする上で欠かせない要素です。
この記事では、Composeファイル(docker-compose.yml)でネットワークを定義する方法から、カスタマイズ、検証、実践構成までを順を追って解説します。


1. Dockerネットワークの基礎

Dockerコンテナは、デフォルトで「bridge」ネットワーク上に配置され、コンテナ名をDNSとして名前解決できます。
ただし、複数のComposeプロジェクトを扱う場合や、通信を明示的に分離したい場合には、自前でネットワークを定義するのが望ましいです。

主なネットワークモードは以下の通りです。

モード概要
bridgeデフォルトのローカルネットワーク。コンテナ間通信が可能。
hostホストのネットワークを直接利用。Linux専用。
noneネットワークなし。完全に独立した環境。
overlaySwarmモードで使用。複数ホスト間で通信可能。

Composeではこれらを簡潔に宣言でき、ネットワーク分離や命名を柔軟に行えます。


2. docker-compose.ymlでネットワークを定義する

まずは基本的なネットワーク定義を見てみましょう。

version: '3'
services:
  web:
    image: nginx
    networks:
      - frontend

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
    networks:
      - backend

networks:
  frontend:
  backend:

上記では「frontend」と「backend」という2つのネットワークを定義し、
web コンテナは frontend に、db コンテナは backend に接続しています。
このようにネットワークを分離することで、DBを外部から直接アクセスできないようにする構成が可能になります。


3. カスタムネットワークの設定例

ネットワークは単に定義するだけでなく、細かい制御も可能です。

3.1 bridgeドライバを指定する

networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: custom_front

driver_optsを指定することで、Dockerが内部で作成するブリッジ名を制御できます。
これにより、既存環境との競合を避けることができます。

3.2 サブネットやIP範囲を指定する

networks:
  backend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

ipamを使えば、特定のIPレンジを手動で設定できます。
複数ネットワークを扱う場合、サブネットの重複を避けることで通信トラブルを防げます。


4. コンテナ間通信を検証する

定義したネットワークが正しく機能しているか、実際に確認してみましょう。

  1. 起動 docker-compose up -d
  2. コンテナ内で名前解決を確認 docker exec -it <web_container> ping db

同じネットワーク上のサービス名をDNSとして利用できるため、IPアドレスを意識せず通信が可能です。
例えば web から db にMySQL接続する場合も、db:3306 でアクセスできます。


5. 実践構成:フロントとDBを分離した安全な環境

セキュリティを考慮した例を見てみましょう。

version: '3.8'
services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - frontend
      - backend

  app:
    image: myapp:latest
    depends_on:
      - db
    networks:
      - backend

  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: securepass
    networks:
      - backend

networks:
  frontend:
  backend:

ここでは frontend ネットワークには公開用の nginx だけが接続し、
backend ネットワークにはアプリとデータベースが所属しています。
外部からはDBへの直接アクセスが遮断され、Web経由のみ通信できる安全な構成です。


6. トラブルシューティング

ネットワーク関連のトラブルは以下のような方法で対処します。

  • ネットワークが存在しないエラー docker network ls docker network create mynet
  • DNSが解決できない
    • Composeのnetworks設定を再確認
    • コンテナを再起動してキャッシュをリセット
  • 不要なネットワークの削除 docker network prune

7. まとめ

Docker Composeでネットワークを定義することで、複数のコンテナを安全かつ整理された形で運用できます。
小規模な開発環境でも、明示的にネットワークを定義しておくことで、将来的な拡張性やセキュリティの確保に役立ちます。


次のステップ

  • depends_onとネットワーク依存関係を組み合わせて起動順序を制御
  • Docker SwarmやKubernetesでのマルチホストネットワーク設計に発展
  • VPNや外部ネットワークとCompose環境を統合

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です