--networkによるDocker Containerネットワーキング

カスタムネットワークを使用してDocker containerを接続する方法を学びます。bridgeネットワーク、DNSベースのサービスディスカバリ、ネットワーク分離、containerが安全に通信する仕組みについて解説します。

Networking

詳細な説明

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

この構成では:

  • webapiに到達可能(両方がfrontend-net上)
  • apidbに到達可能(両方がbackend-net上)
  • webdb到達不可(異なるネットワーク、共有ネットワークなし)

複数ネットワークへの接続

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-backendmonitoringdata-tier)。

ユースケース

フロントエンドプロキシ、APIサーバー、データベースがそれぞれ別々のcontainerで動作するマイクロサービスアプリケーションを設計する際、適切なネットワーク分離を備えた制御された通信チャネルが必要な場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く