현재 위치: > 최신 기사 목록> 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 Logs 및 PHP 오류 로그를 확인하여 소켓 생성 및 바인딩이 잘못되었는지 확인하십시오.

5. 요약

Docker 컨테이너에서 Socket_accept ()를 사용하는 경우 주요 문제는 종종 기능 자체가 아니라 부적절한 네트워크 구성의 이유입니다. 청취 주소가 0.0.0.0 인지 확인하면 컨테이너 포트가 올바르게 매핑되며 컨테이너 간 네트워크 연결이 안정적인 소켓 서비스를 달성하는 열쇠입니다. Docker Network 모드와 Docker Compose 서비스 검색 메커니즘을 결합하면 디버깅 난이도를 크게 줄이고 배포 효율성을 향상시킬 수 있습니다.

합리적인 구성을 통해 Docker 컨테이너에 안정적이고 효율적인 PHP 소켓 서비스를 구축하여 시스템 간 통신을 강력하게 지원할 수 있습니다.