ネットワーク性能と動作の比較
ここでは、Docker のブリッジネットワーキングとホストネットワーキングの実際の違いを確認するためにいくつかのテストを実行しましょう。
ネットワーク性能のテスト
まず、ブリッジネットワーキングを使用するコンテナとホストネットワーキングを使用するコンテナを作成し、それらの性能を比較します。
- 前の nginx コンテナを停止して削除します。
docker stop nginx-host
docker rm nginx-host
- ブリッジネットワーキングを使用する新しいコンテナを作成して性能をテストします。
docker run --name bridge-test -d --network bridge nginx:alpine
- ホストネットワーキングを使用する別のコンテナを作成します。
docker run --name host-test -d --network host nginx:alpine
docker exec
を使用して、各コンテナで簡単なネットワークテストを実行します。
ブリッジネットワークのコンテナの場合:
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
ホストネットワークのコンテナの場合:
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
実行時間を比較してください。通常、ホストネットワークのコンテナは追加のネットワークレイヤーを回避するため、わずかに性能が良くなります。
ネットワークインターフェイスの調査
両方のコンテナのネットワークインターフェイスを調査しましょう。
- ブリッジネットワークのコンテナの場合:
docker exec bridge-test ip addr show
このコンテナがホストから分離された独自のネットワークインターフェイスを持っていることがわかります。
- ホストネットワークのコンテナの場合:
docker exec host-test ip addr show
このコンテナがホストシステムとまったく同じネットワークインターフェイスを持っていることに気づくでしょう。これにはすべての物理ネットワークインターフェイスが含まれます。
- ホストのネットワークインターフェイスと比較します。
ip addr show
ホストネットワークのコンテナのインターフェイスは、ホストシステムのものと一致するはずです。
ポート競合の理解
ホストネットワーキングを使用する場合、コンテナがホストで既に使用されているポートを使用しようとすると、ポート競合が発生する可能性があります。
- すべての実行中のコンテナを停止して削除します。
docker stop bridge-test host-test
docker rm bridge-test host-test
- ホストでポート 8080 を使用するサービスを起動します。
python3 -m http.server 8080 &
- ホストネットワーキングを使用し、同じくポート 8080 を使用しようとするコンテナを実行してみます。
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
ホストでポート 8080 が既に使用されているため、エラーが表示されるはずです。
- Python HTTP サーバーをクリーンアップします。
kill %1
これは、ホストネットワーキングの潜在的な欠点の 1 つを示しています。ホストとのポート競合に注意する必要があります。