Position actuelle: Accueil> Derniers articles> Problèmes de configuration du réseau avec l'utilisation de socket_accept () dans Docker Container

Problèmes de configuration du réseau avec l'utilisation de socket_accept () dans Docker Container

M66 2025-05-20

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.

1. Problème Contexte

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.

2. Des questions et des causes fréquemment posées

1. Le conteneur n'a pas exposé le port

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.

2. L'adresse de liaison est incorrecte

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 .

3. Réseau croisé non configuré

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.

3. Solution

1. Mappage des ports

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/ .

2. Utilisez 0.0.0.0 pour lier l'adresse

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.

3. Configurez un réseau personnalisé pour la communication transversale

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);

4. Configurer le réseau Docker Compose

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 .

4. Suggestions de débogage

  • 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.

5. Résumé

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.