🐳

【Docker基本】Docker DNS を活用したプロキシ+ロードバランサー構成の理論と実践

に公開

Docker環境でマイクロサービスを構築する際、コンテナ同士の通信とトラフィック分散(ロードバランシング)は非常に重要な要素です。本記事では、Docker DNSを活用し、NginxTraefikのようなプロキシを通して内部サービスへリクエストを中継する構成について、図解を交えながら丁寧に解説します。


🧠 1. 概要:Docker DNS + プロキシ + ロードバランサー

🔧 キーコンポーネント

  • Docker DNS:コンテナ名をドメイン名のように扱い、IPを使わずに相互通信が可能
  • プロキシ(Nginx / HAProxy / Traefikなど):外部からのリクエストを受け取り、内部サービスにルーティング
  • ロードバランサー:複数のサービスインスタンスに負荷を分散

📡 2. 構成図でイメージをつかむ

以下は、クライアントからのリクエストをNginxが受け取り、複数のバックエンド(Node.jsやPythonアプリなど)へ振り分ける典型的な構成図です。

+-------------------+            +--------------------+
|  クライアント        |  ---> DNS  |  Dockerホストマシン      |
+-------------------+            |  (Docker Engine)   |
                                 +--------------------+
                                         |
                      +------------------|-------------------+
                      |                  |                   |
               +------+----+      +------+-----+     +--------+
               |  nginx    | ---> |  app_1     |     |  app_2  |
               |  proxy    |      | (backend)  |     |         |
               +-----------+      +------------+     +--------+
  • nginx はフロントエンドのリバースプロキシとして機能
  • app_1, app_2 は同一サービスのインスタンス(例:APIサーバー)
  • Docker DNS により、nginxapp_1 / app_2 というホスト名で通信可能

🧩 3. Docker DNS の役割とは?

Dockerはユーザー定義ネットワークを使用することで、コンテナ名をDNSとして解決できる内部DNSサーバー(127.0.0.11)を提供します。

🔍 具体的な動作

  • app_1app_2 といったコンテナ名をドメイン名のように扱える
  • NginxやHAProxyが名前解決で各インスタンスへルーティング
  • DNSラウンドロビン方式で複数インスタンスにトラフィックを自動分散

⚙️ 4. なぜこの構成を使うのか?(メリット)

理由・目的 説明
動的サービスディスカバリ コンテナ再起動時も名前でアクセスでき、IP変更に左右されない
スケールアウトが容易 同一イメージの複数起動で、同じ名前空間に自動登録(例:app_1, app_2
インフラ管理の簡略化 IPを個別に管理する必要がなく、設定を単純化
ロードバランサーを簡単構築 nginxtraefikでDNS名に対して負荷分散が可能
サービスの分離とセキュリティ Dockerネットワークによる隔離+明示的な通信指定が可能

🧪 5. Nginxを使った簡易ロードバランシングの例

🔧 Nginx設定例(nginx.conf

upstream backend {
    server app_1:3000;
    server app_2:3000;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

この例では、nginx がクライアントのリクエストを受け、app_1, app_2 にラウンドロビン方式で転送します。これらのホスト名はDocker DNSによって自動的に解決されます。


📦 6. Docker Composeでの活用例

version: '3'
services:
  app_1:
    image: my-backend
    ports:
      - "3001:3000"

  app_2:
    image: my-backend
    ports:
      - "3002:3000"

  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app_1
      - app_2
  • 上記の構成では nginx から app_1:3000 および app_2:3000 に自動的に接続可能
  • Dockerネットワーク内でDNS解決が行われ、IPアドレス指定は不要

🌍 7. 応用・拡張

より高度な構成を求める場合、以下のツールが便利です。

ツール 特徴
Traefik 自動SSL(Let's Encrypt)、Dockerイベントによる自動ルーティング登録
HAProxy 高速でスケーラブルなロードバランサー。複雑なヘルスチェックやルール定義が可能
Envoy マイクロサービス向けプロキ시。gRPCやHTTP/2にも対応

🧠 まとめ

要素 説明
Docker DNS コンテナ名によるサービス間通信のための内部ネームリゾルバ
プロキシ (Nginx等) 外部リクエストを受けて内部サービスに振り分ける
ロードバランシング 複数インスタンスにリクエストを分散し、可用性と性能を向上
主な利点 柔軟性、構成の簡潔さ、IPアドレスの意識不要、マイクロサービスに最適化された構造化管理

💡補足

  • DockerのデフォルトbridgeネットワークではDNS解決が使えません。ユーザー定義ブリッジネットワークを使うことでこの構成が可能になります。
  • docker-composeはこのネットワークを自動的に作成します。

Discussion