--networkによるDocker Containerネットワーキング
カスタムネットワークを使用してDocker containerを接続する方法を学びます。bridgeネットワーク、DNSベースのサービスディスカバリ、ネットワーク分離、containerが安全に通信する仕組みについて解説します。
詳細な説明
Dockerネットワークによるcontainer間通信
Dockerにはcontainer同士および外部との通信を可能にする組み込みネットワーキングが提供されています。デフォルトのbridgeネットワークは基本的なユースケースに対応しますが、ユーザー定義bridgeネットワークはDNS解決、より良い分離、および容易な管理を提供します。
デフォルトBridgeネットワーク
すべてのDockerインストールにはデフォルトのbridgeネットワークが含まれています。このネットワーク上のcontainerはIPアドレスで通信できますが、container名では通信できません:
docker run -d --name web nginx
docker run -d --name app my-app
# 'app'はデフォルトbridge上で'web'に名前でアクセスできない
ユーザー定義Bridgeネットワーク
カスタムネットワークを作成すると、container間のDNSベースの名前解決が有効になります:
docker network create app-network
docker run -d --name db --network app-network postgres:16
docker run -d --name cache --network app-network redis:7
docker run -d --name api --network app-network my-api-image
api container内から、PostgreSQLにdb:5432で、Redisにcache:6379で接続できます。IPアドレスは不要です。
ネットワーク分離
異なるネットワーク上のcontainerはデフォルトでは互いに通信できません。これによりセキュリティの分離が提供されます:
docker network create frontend-net
docker network create backend-net
docker run -d --name web --network frontend-net nginx
docker run -d --name api --network frontend-net --network backend-net my-api
docker run -d --name db --network backend-net postgres:16
この構成では:
webはapiに到達可能(両方がfrontend-net上)apiはdbに到達可能(両方がbackend-net上)webはdbに到達不可(異なるネットワーク、共有ネットワークなし)
複数ネットワークへの接続
containerは複数のネットワークに接続できます。docker runコマンドは1つの--networkフラグをサポートしており、追加のネットワークは作成後に追加します:
docker run -d --name api --network frontend-net my-api
docker network connect backend-net api
ネットワークドライバー
Dockerはいくつかのネットワークドライバーをサポートしています:
| ドライバー | ユースケース |
|---|---|
bridge |
単一ホストのcontainer間通信(デフォルト) |
host |
containerがホストのネットワークスタックを直接使用 |
overlay |
マルチホスト通信(Docker Swarm) |
macvlan |
MACアドレスを割り当て、containerが物理デバイスとして表示 |
none |
ネットワーキングなし |
Hostネットワークモード
hostネットワークモードはネットワーク分離を完全に除去します:
docker run -d --network host nginx
Nginxはホストのport 80で直接リッスンします。portマッピングは不要ですが、分離のメリットが失われます。
ベストプラクティス
- マルチcontainerアプリケーションではデフォルトbridgeの代わりに常にユーザー定義ネットワークを使用してください。
- ネットワークセグメンテーションを使用して、通信可能なcontainerを制限してください。
- 特定のパフォーマンス要件がない限り、本番環境では
--network hostを避けてください。 - ネットワークには説明的な名前を付けてください(
app-backend、monitoring、data-tier)。
ユースケース
フロントエンドプロキシ、APIサーバー、データベースがそれぞれ別々のcontainerで動作するマイクロサービスアプリケーションを設計する際、適切なネットワーク分離を備えた制御された通信チャネルが必要な場合に使用します。