PHPを使用してソケットベースのサーバーを構築するとき、 socket_accept()は、クライアントへのサーバー側の接続を実装する重要な関数です。ただし、そのようなプログラムをDockerコンテナで実行する場合、ネットワーク構成により、接続タイムアウト、リッスンの不能、クライアント接続の障害など、 Socket_Accept()が適切に機能しない場合があります。この記事では、PHPのソケットサーバーがスムーズに実行できるように、Docker環境でネットワークを構成する方法に関する詳細な指示を提供します。
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のネットワーク構成に由来しています。
コンテナを起動するときにサーバーによって聴くポートがホストにマッピングされない場合、クライアントは自然に接続できません。例えば:
docker run -d php-server
上記のコマンドはポートマッピングを指定しておらず、PHPサーバーによって聞かれる8080ポートは外の世界には見えません。
ソケットを127.0.0.1にバインドすると、コンテナ内のプログラムのみがこのサービスにアクセスできます。ホストまたは他のコンテナへのアクセスを許可するには、 0.0.0.0にバインドする必要があります。
複数のコンテナ間で通信が必要な場合、それらは同じDockerネットワークに接続する必要があります。そうしないと、互いに見えません。
コンテナを起動するときは、 -pパラメーターを使用して、コンテナポートをホストにマッピングします。
docker run -d -p 8080:8080 php-server
これにより、コンテナのポート8080をホストの同じポートにマッピングし、クライアントはhttp://m66.net:8080/を介してアクセスできます。
PHPソケットプログラムでは、 0.0.0.0を使用してアドレスをバインドしてください。
socket_bind($socket, '0.0.0.0', 8080);
これにより、コンテナの内部アドレスやホストがマッピングしたポートを含む、利用可能なすべてのネットワークインターフェイスをリッスンすることができます。
複数のコンテナ(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);
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を介してサービスにアクセスできます。
netstat -tlnpまたはss -tlnpを使用して、ポートが聴いているかどうかを確認します。
Telnet M66.NET 8080またはNC -ZV M66.NET 8080を使用して、ポート接続をテストします。
DockerログとPHPエラーログを確認して、ソケットの作成とバインディングが間違っているかどうかを確認します。
socket_accept()がDockerコンテナで使用される場合、主な問題はしばしば関数自体ではなく、不適切なネットワーク構成の理由です。リスニングアドレスが0.0.0.0であることを確認し、コンテナポートが正しくマッピングされ、コンテナ間のネットワーク接続が安定したソケットサービスを実現するための鍵です。 DockerネットワークモードとDockerの構成サービスの発見メカニズムを組み合わせると、デバッグの難易度を大幅に軽減し、展開効率を改善できます。
妥当な構成を使用すると、Dockerコンテナに安定した効率的なPHPソケットサービスを構築し、システム間通信を強力にサポートすることができます。