リンドくんたなべ先生、Dockerでコンテナを動かせるようになったんですけど、コンテナ同士をどうやって通信させればいいんですか?ネットワークの設定が複雑で...
たなべDockerのネットワークは最初は難しく感じるかもしれないけど、基本的な3つのモードを理解すれば、実はとてもシンプルなんだよ。
今日はその仕組みを一緒に見ていこう。
Dockerコンテナのネットワークとは
Dockerを使い始めた方の多くが、コンテナ間の通信やホストとの接続で戸惑うのではないでしょうか。
コンテナは独立した環境として動作するため、適切なネットワーク設定がなければ、他のコンテナやホストマシンと通信できません。
Dockerにはコンテナをネットワークに接続するための仕組みが用意されており、用途に応じて複数のネットワークモードが選択できます。主なネットワークモードは以下の3つです。
- bridge(ブリッジ) - コンテナ専用のネットワークを作り、コンテナ同士を接続
- host(ホスト) - ホストマシンのネットワークを直接使用
- overlay(オーバーレイ) - 複数のDockerホストをまたいでコンテナを接続
これらのネットワークモードを理解することで、開発環境から本番環境まで、あらゆる場面で適切なネットワーク構成を組むことができるようになります。
まずは、最も基本的でよく使われるbridgeネットワークから見ていきましょう。
bridgeネットワーク
リンドくんbridgeネットワークって何ですか?いつも何も指定せずにコンテナを起動してるんですけど...
たなべ実は何も指定しない場合、自動的にデフォルトのbridgeネットワークに接続されているんだよ。
これがDockerの標準的なネットワーク方式なんだ。
bridgeネットワークの仕組み
bridgeネットワークは、Dockerが作成する仮想的なネットワークです。このネットワークに接続されたコンテナ同士は、互いに通信できるようになります。
主な特徴は以下の通りです。
- コンテナごとに独立したIPアドレスが割り当てられる
- 同じbridgeネットワーク内のコンテナ同士で通信可能
- ホストからコンテナへのアクセスにはポートマッピングが必要
- デフォルトで使用されるネットワークモード
デフォルトbridgeとカスタムbridgeの違い
Dockerには最初から用意されている「デフォルトbridge」と、自分で作成する「カスタムbridge」があります。
カスタムbridgeを使うメリットは大きく、以下のような利点があります。
- コンテナ名で通信できる(自動DNS解決)
- ネットワークの分離が容易
- より細かいネットワーク制御が可能
実際の使用例を見てみましょう。
bridgeネットワークの実践例
# カスタムbridgeネットワークを作成
docker network create my-bridge-network
# ネットワークの一覧を確認
docker network ls
# Webサーバーコンテナをカスタムネットワークに接続
docker run -d --name web-server \
--network my-bridge-network \
nginx
# データベースコンテナを同じネットワークに接続
docker run -d --name database \
--network my-bridge-network \
mysql:8.4
# web-serverからdatabaseへ接続できることを確認
docker exec web-server ping databaseこの例では、web-serverコンテナからdatabaseコンテナへ、コンテナ名で直接通信できる点に注目してください。カスタムbridgeでは、このような名前解決が自動的に行われます。
ポートマッピングによる外部公開
コンテナ内のサービスを外部(ホストマシンや他のマシン)から利用するには、ポートマッピングが必要です。
# ホストの8080ポートをコンテナの80ポートにマッピング
docker run -d --name web-app \
--network my-bridge-network \
-p 8080:80 \
nginxこのコマンドにより、http://localhost:8080にアクセスすると、コンテナ内のnginxに接続できるようになります。
bridgeネットワークは開発環境や単一ホストでの運用に最適なネットワークモードです。複数のコンテナを組み合わせたアプリケーション構築の基本となります。
hostネットワーク
リンドくんbridgeとは別に、hostネットワークというのもあるんですよね?これはどう違うんですか?
たなべhostネットワークは、コンテナがホストマシンのネットワークを直接使うモードなんだ。
つまり、コンテナとホストのネットワークが完全に同じになるんだよ。
hostネットワークの特徴
hostネットワークモードでは、コンテナが独自のネットワーク空間を持たず、ホストマシンのネットワークインターフェースを直接使用します。
主な特徴は以下の通りです。
- ポートマッピングが不要 - コンテナのポートがそのままホストのポートとして公開される
- ネットワークのオーバーヘッドが少ない - ネットワーク性能が最大限発揮される
- IPアドレスがホストと同じ - コンテナ独自のIPアドレスは持たない
- ネットワーク分離がない - セキュリティ面でbridgeより弱い
hostネットワークの使用例
# hostネットワークでnginxを起動
docker run -d --name web-host \
--network host \
nginx
# この場合、http://localhost:80 で直接アクセス可能
# ポートマッピング(-p)は不要hostネットワークを使用する場合、コンテナ内のアプリケーションが使用するポートは、ホストマシン上で既に使用されていないポートでなければなりません。
hostネットワークが適している場面
hostネットワークは以下のような場合に有効です。
- ネットワーク性能を最大化したい場合 - 高スループットが求められるアプリケーション
- 特定のネットワークプロトコルを使用する場合 - ブロードキャストやマルチキャストなど
- デバッグやトラブルシューティング - ネットワークの挙動を詳しく調べたい場合
一方で、hostネットワークには注意点もあります。
- ポートの競合が起こりやすい - 同じポートを使うコンテナを複数起動できない
- Linuxホストでのみ完全に機能 - WindowsやMacではbridgeネットワークとして動作する
- セキュリティリスクが高まる - コンテナの分離が弱くなる
実際の開発では、ネットワーク性能が重要な場面や特殊なネットワーク要件がある場合を除き、bridgeネットワークの使用が推奨されます。
overlayネットワーク
リンドくん先生、overlayネットワークって何ですか?bridgeやhostとは違うんですか?
たなべoverlayは複数のDockerホストをまたいでコンテナを接続できる特別なネットワークなんだ。
つまり、異なるサーバー上のコンテナ同士を、まるで同じネットワークにいるかのように通信させられるんだよ。
overlayネットワークの仕組み
overlayネットワークは、Docker SwarmモードまたはDocker Composeのスケールアウト環境で使用される高度なネットワーク機能です。
主な特徴は以下の通りです。
- 複数のDockerホスト間でコンテナを接続 - 物理的に離れたサーバー同士を仮想的に接続
- 暗号化通信をサポート - セキュアな通信が可能
- サービスディスカバリ機能 - コンテナの追加・削除に自動対応
- 負荷分散機能 - 複数のコンテナへのリクエストを自動分散
overlayネットワークの使用例
overlayネットワークを使用するには、まずDocker Swarmモードを有効にする必要があります。
# Swarmモードの初期化(マネージャーノードで実行)
docker swarm init
# overlayネットワークを作成
docker network create \
--driver overlay \
--attachable \
my-overlay-network
# サービスとしてコンテナを起動
docker service create \
--name web-service \
--network my-overlay-network \
--replicas 3 \
nginx
# 別のサービスを同じoverlayネットワークに接続
docker service create \
--name api-service \
--network my-overlay-network \
--replicas 2 \
my-api-imageこのように、overlayネットワークではサービスという単位でコンテナを管理します。複数のレプリカ(同じコンテナの複数インスタンス)が自動的に負荷分散されます。
マルチホスト環境の構築
overlayネットワークの真価は、複数のホストにまたがる環境で発揮されます。
# マネージャーノード(サーバー1)でSwarmを初期化
docker swarm init --advertise-addr 192.168.1.10
# 出力されたjoinトークンを使って、ワーカーノード(サーバー2)を参加させる
docker swarm join --token <トークン> 192.168.1.10:2377
# overlayネットワークを作成
docker network create --driver overlay multi-host-network
# サービスを作成(自動的に複数ホストに分散配置される)
docker service create \
--name distributed-app \
--network multi-host-network \
--replicas 5 \
my-app-imageこの設定により、5つのコンテナが複数のホストに自動的に配置され、すべて同じmulti-host-networkで通信できるようになります。
overlayネットワークの活用場面
overlayネットワークは、以下のような大規模な本番環境で力を発揮します。
- クラスタ環境の構築 - 複数サーバーでのコンテナオーケストレーション
- 高可用性システム - 障害時の自動フェイルオーバー
- スケールアウト - 負荷に応じたコンテナの自動増減
- マイクロサービスアーキテクチャ - 複数のサービス間の安全な通信
ただし、小規模な開発環境や単一ホストでの運用では、overlayネットワークの複雑さは必要ありません。まずはbridgeネットワークを理解し、必要に応じてoverlayに移行するのが良いでしょう。
まとめ
リンドくんそれぞれのネットワークの特徴がわかってきました!でも、結局どれを使えばいいのか迷います...
たなべ大丈夫!基本的にはbridgeから始めればOKだよ。
まずはbridgeで慣れてから、必要に応じて他のモードを使うのがおすすめだね。
今回は、Dockerの3つの主要なネットワークモード(bridge・host・overlay)について詳しく解説してきました。それぞれの特徴を改めて整理しましょう。
bridgeネットワーク - 最も基本的で汎用的
- 開発環境やテスト環境に最適
- 単一ホストでのコンテナ間通信
- セキュリティとパフォーマンスのバランスが良い
- 迷ったらまずこれを選ぶ
hostネットワーク - 高性能が必要な場面で
- ネットワーク性能を最大限に引き出したい場合
- 特殊なネットワークプロトコルを使用する場合
- Linuxホストでのみ推奨
overlayネットワーク - 本番環境の大規模システムで
- 複数のDockerホストをまたぐ環境
- Docker SwarmやKubernetesでの運用
- 高可用性とスケールアウトが必要な場合
最初から完璧に理解しようとせず、実際に手を動かして試してみることが何より大切です。
小さなプロジェクトから始めて、徐々に複雑な構成に挑戦していきましょう。
Dockerネットワークの理解は、コンテナ技術を実務で活用する上で欠かせないスキルです。
この記事で学んだ基礎知識を土台に、ぜひ実践的なプロジェクトに挑戦してみてください。





