🐳
【Docker基本】Docker DNS を活用したプロキシ+ロードバランサー構成の理論と実践
Docker環境でマイクロサービスを構築する際、コンテナ同士の通信とトラフィック分散(ロードバランシング)は非常に重要な要素です。本記事では、Docker DNSを活用し、NginxやTraefikのようなプロキシを通して内部サービスへリクエストを中継する構成について、図解を交えながら丁寧に解説します。
🧠 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 により、
nginxはapp_1/app_2というホスト名で通信可能
🧩 3. Docker DNS の役割とは?
Dockerはユーザー定義ネットワークを使用することで、コンテナ名をDNSとして解決できる内部DNSサーバー(127.0.0.11)を提供します。
🔍 具体的な動作
-
app_1やapp_2といったコンテナ名をドメイン名のように扱える - NginxやHAProxyが名前解決で各インスタンスへルーティング
- DNSラウンドロビン方式で複数インスタンスにトラフィックを自動分散
⚙️ 4. なぜこの構成を使うのか?(メリット)
| 理由・目的 | 説明 |
|---|---|
| ✅ 動的サービスディスカバリ | コンテナ再起動時も名前でアクセスでき、IP変更に左右されない |
| ✅ スケールアウトが容易 | 同一イメージの複数起動で、同じ名前空間に自動登録(例:app_1, app_2) |
| ✅ インフラ管理の簡略化 | IPを個別に管理する必要がなく、設定を単純化 |
| ✅ ロードバランサーを簡単構築 |
nginxやtraefikで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