🐳
【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.conf
)
🔧 Nginx設定例(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