Lors de la création d'un serveur basé sur une prise à l'aide de PHP, socket_accept () est une fonction clé pour implémenter la connexion côté serveur au client. Cependant, lors de l'exécution de ces programmes dans un conteneur Docker, la configuration du réseau peut amener Socket_Accept () à ne pas fonctionner correctement, telles que le délai de connexion, l'incapacité à écouter ou l'échec de la connexion du client. Cet article fournira des instructions détaillées sur la façon de configurer le réseau dans un environnement Docker afin que le serveur de socket de PHP puisse s'exécuter en douceur.
Les services de socket en PHP sont généralement mis en œuvre via les étapes suivantes:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
$client = socket_accept($socket);
Il n'y a essentiellement aucun problème à exécuter le code ci-dessus dans un environnement de développement local, mais après l'avoir déployé dans un conteneur Docker, vous rencontrez souvent le blocage socket_accept () et le client ne peut pas se connecter. La plupart des problèmes découlent de la configuration du réseau de Docker.
Si le port écouté par le serveur n'est pas mappé à l'hôte lors du démarrage du conteneur, le client ne pourra naturellement pas se connecter. Par exemple:
docker run -d php-server
La commande ci-dessus ne spécifie pas de mappage de port, et le port 8080 écouté par le serveur PHP n'est pas visible pour le monde extérieur.
Si vous liez la prise à 127.0.0.1 , seuls les programmes dans le conteneur peuvent accéder à ce service. Pour permettre l'accès à l'hôte ou à un autre conteneur, vous devez vous lier à 0,0.0.0 .
Lorsque la communication est requise entre plusieurs conteneurs, ils doivent être connectés au même réseau Docker, sinon ils sont invisibles les uns aux autres.
Lorsque vous démarrez le conteneur, utilisez le paramètre -p pour mapper le port de conteneur à l'hôte:
docker run -d -p 8080:8080 php-server
Cela mappe le port 8080 du conteneur au même port de l'hôte, et le client peut y accéder via http://m66.net:8080/ .
Dans le programme PHP Socket, assurez-vous d'utiliser 0.0.0.0 pour lier l'adresse:
socket_bind($socket, '0.0.0.0', 8080);
Cela vous permet d'écouter toutes les interfaces réseau disponibles, y compris l'adresse interne du conteneur et les ports mappés par l'hôte.
Si plusieurs conteneurs (tels qu'un conteneur de service de socket PHP et un conteneur client) sont nécessaires pour communiquer, il est recommandé de créer un réseau personnalisé:
docker network create my-network
Utilisez ensuite ce réseau pour démarrer le conteneur:
docker run -d --name php-server --network my-network php-server
docker run -it --network my-network php-client
À l'heure actuelle, PHP-Client peut se connecter directement au service via le nom de conteneur PHP-Server , par exemple:
socket_connect($client, 'php-server', 8080);
Lorsque vous utilisez Docker Compose, vous pouvez explicitement spécifier le réseau dans 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
Le code client peut toujours accéder au service via PHP-Server: 8080 .
Utilisez NetStat -Tlnp ou SS -TLNP pour voir si le port écoute;
Utilisez Telnet M66.NET 8080 ou NC -ZV M66.NET 8080 pour tester la connectivité du port;
Vérifiez les journaux Docker et les journaux d'erreur PHP pour vérifier si la création de socket et la liaison sont incorrectes.
Lorsque socket_accept () est utilisé dans les conteneurs Docker, le problème principal n'est souvent pas la fonction elle-même, mais la raison de la configuration du réseau inappropriée. S'assurant que l'adresse d'écoute est de 0,0.0.0 , le port de conteneur est correctement mappé et la connexion réseau entre les conteneurs est la clé pour obtenir des services de socket stables. La combinaison du mode Docker Network et du mécanisme de découverte de services Docker Compose peut réduire considérablement les difficultés de débogage et améliorer l'efficacité du déploiement.
Avec une configuration raisonnable, vous pouvez créer des services de socket PHP stables et efficaces dans des conteneurs Docker, fournissant un support puissant pour la communication inter-système.