Dockerコンテナでmediasoupを動かした際にProducerやConsumerのconnectionstatechangeでfailedが通知される問題と解決策
Ubuntu上のDocker環境でmediasoupを運用していると、ProducerやComsumerのconnectionstatechangeイベントでfailedが通知されるケースに遭遇することがあります。この現象は通信の確立に失敗していることを示します。本記事では、この問題点の概要から原因、そしてDocker Composeを活用した具体的な対応策を解説します。
問題点:ProducerやConsumerのconnectionstatechangeがfailedになる
mediasoupのTransportは、WebRTCの接続状態変化をconnectionstatechangeイベントで通知します。通常はconnecting→connectedへと遷移しますが、ここでfailedが発生すると、メディアストリームの送受信が正常に行えない状態となります。
Dockerコンテナ環境でmediasoupを稼働させている場合、このfailed状態が発生するため、原因の特定と対策が不可欠です。
原因:Dockerのネットワーク設定によるUDPポートの疎通不良
mediasoupはWebRTCのメディア通信にUDPポートを広範囲に使用します。DockerコンテナがホストOSと分離されたネットワーク環境で動いている場合、以下のようなネットワーク障壁が発生しやすいです。
- UDPポート範囲の開放不足
mediasoupのWorkerが利用するUDPポート群(例:10000~10100)がDockerホスト側で開放・マッピングされていない listenIpsのannouncedIp設定不備
クライアントがアクセスするパブリックIPやドメイン名を正しく設定していない- Dockerのネットワークモードの制約
デフォルトのbridgeネットワークでは、UDP通信がホストのネットワーク環境と完全に同期せず、疎通に問題が生じることがある
これらにより、ICE接続の確立やDTLSハンドシェイクに失敗し、結果としてProducerのconnectionstatechangeがfailedとなります。
対応策:Docker Composeで"network_mode: host"を設定しUDP疎通問題を解消
問題を根本から解決するために効果的なのが、Dockerコンテナのネットワークモードをホストのネットワークと同一にする方法です。具体的には、docker-compose.ymlの対象サービスに以下の設定を追加します。
services:
mediasoup:
image: your-mediasoup-image
network_mode: host
なぜ"network_mode: host"が効くのか?
- ホストのネットワークスタックを直接利用できるため、UDPポートの開放やマッピングの煩雑な設定を回避できる
- mediasoupが使用するUDPポートがホストのネットワーク空間に直接存在するため、ICE候補の交換やDTLSハンドシェイクがスムーズに行える
- 結果として、
connectionstatechangeがfailedとなる問題が解消され、安定したメディアストリームの送受信が可能になる
注意点
network_mode: hostはLinux環境に限定されることが多く、Docker Desktop for MacやWindowsでは動作しない場合がある- ポートマッピング設定(
ports:)はホストモード使用時には無効となるので注意する
まとめ
Dockerコンテナでmediasoupを運用する際にProducerの接続失敗(connectionstatechange: failed)が発生する場合、最も多い原因はネットワーク設定によるUDPポートの疎通不良です。docker-compose.ymlでnetwork_mode: hostを指定することで、ホストのネットワークを直接利用でき、この問題を簡潔に解決できます。
