現在の位置: ホーム> 最新記事一覧> Dockerコンテナでsocket_accept()を使用する場合のネットワーク構成の問題

Dockerコンテナでsocket_accept()を使用する場合のネットワーク構成の問題

M66 2025-05-20

PHPを使用してソケットベースのサーバーを構築するとき、 socket_accept()は、クライアントへのサーバー側の接続を実装する重要な関数です。ただし、そのようなプログラムをDockerコンテナで実行する場合、ネットワーク構成により、接続タイムアウト、リッスンの不能、クライアント接続の障害など、 Socket_Accept()が適切に機能しない場合があります。この記事では、PHPのソケットサーバーがスムーズに実行できるように、Docker環境でネットワークを構成する方法に関する詳細な指示を提供します。

1。問題の背景

PHPのソケットサービスは、通常、次の手順を通じて実装されます。

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
$client = socket_accept($socket);

基本的に、ローカル開発環境で上記のコードを実行するのに問題はありませんが、Dockerコンテナに展開した後、 socket_accept()ブロッキングに遭遇することが多く、クライアントは接続できません。問題のほとんどは、Dockerのネットワーク構成に由来しています。

2。よくある質問と原因

1.容器はポートを露出していません

コンテナを起動するときにサーバーによって聴くポートがホストにマッピングされない場合、クライアントは自然に接続できません。例えば:

 docker run -d php-server

上記のコマンドはポートマッピングを指定しておらず、PHPサーバーによって聞かれる8080ポートは外の世界には見えません。

2。バインディングアドレスが正しくありません

ソケットを127.0.0.1にバインドすると、コンテナ内のプログラムのみがこのサービスにアクセスできます。ホストまたは他のコンテナへのアクセスを許可するには、 0.0.0.0にバインドする必要があります。

3。構成されていないクロスコンテナーネットワーク

複数のコンテナ間で通信が必要な場合、それらは同じDockerネットワークに接続する必要があります。そうしないと、互いに見えません。

3。解決策

1。マッピングポート

コンテナを起動するときは、 -pパラメーターを使用して、コンテナポートをホストにマッピングします。

 docker run -d -p 8080:8080 php-server

これにより、コンテナのポート8080をホストの同じポートにマッピングし、クライアントはhttp://m66.net:8080/を介してアクセスできます。

2。0.0.0.0を使用してアドレスをバインドします

PHPソケットプログラムでは、 0.0.0.0を使用してアドレスをバインドしてください。

 socket_bind($socket, '0.0.0.0', 8080);

これにより、コンテナの内部アドレスやホストがマッピングしたポートを含む、利用可能なすべてのネットワークインターフェイスをリッスンすることができます。

3.クロスコンテナー通信用のカスタムネットワークを構成します

複数のコンテナ(PHPソケットサービスコンテナやクライアントコンテナなど)が通信するために必要な場合は、カスタムネットワークを作成することをお勧めします。

 docker network create my-network

次に、そのネットワークを使用してコンテナを起動します。

 docker run -d --name php-server --network my-network php-server
docker run -it --network my-network php-client

現時点では、 PHP-Clientはコンテナ名PHP-Serverを介してサービスに直接接続できます。

 socket_connect($client, 'php-server', 8080);

4. Docker Compose Networkを設定します

Docker Composeを使用する場合、 Docker-Compose.ymlでネットワークを明示的に指定できます。

 version: '3'
services:
  php-server:
    build: .
    ports:
      - "8080:8080"
    networks:
      - app-net

  php-client:
    build: ./client
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

クライアントコードは引き続きPHP-Server:8080を介してサービスにアクセスできます。

4。デバッグの提案

  • netstat -tlnpまたはss -tlnpを使用して、ポートが聴いているかどうかを確認します。

  • Telnet M66.NET 8080またはNC -ZV M66.NET 8080を使用して、ポート接続をテストします。

  • DockerログとPHPエラーログを確認して、ソケットの作成とバインディングが間違っているかどうかを確認します。

5。概要

socket_accept()がDockerコンテナで使用される場合、主な問題はしばしば関数自体ではなく、不適切なネットワーク構成の理由です。リスニングアドレスが0.0.0.0であることを確認し、コンテナポートが正しくマッピングされ、コンテナ間のネットワーク接続が安定したソケットサービスを実現するための鍵です。 DockerネットワークモードとDockerの構成サービスの発見メカニズムを組み合わせると、デバッグの難易度を大幅に軽減し、展開効率を改善できます。

妥当な構成を使用すると、Dockerコンテナに安定した効率的なPHPソケットサービスを構築し、システム間通信を強力にサポートすることができます。