WebRTC 테스트를 위한 Docker 환경 구성

Docker 환경 구축

WebRTC를 테스트 하기 위해서는 로컬에 테스트 환경을 구축해야 합니다.

윈도우 PC에 docker desktop이 설치되어 있다는 가정하에 turn 서버와 nginx를 docker 컨테이너로 구성해 보겠습니다.

 

docker0 인터페이스

docker는 호스트 머신의 네트워크와 격리된 가상 네트워크 환경을 제공하기 위해 docker0 브리지를 사용합니다.

이 브리지는 Docker 컨테이너들이 호스트 머신과 외부 네트워크와 통신할 수 있도록 해줍니다.

 

Host의 eth0 인터페이스

호스트의 이더넷 인터페이스 입니다.

Docker 컨테이너들이 외부 네트워크에 접근할 때 호스트의 eth0을 사용합니다.

 

veth (virtual ethernet)

docker 컨테이너를 생성하면 docker0 브리지와 통신하기 위한 eth0라는 네트워크 인터페이스를 할당받습니다.

동시에 docker0 브리지에도 veth 네트워크 인터페이스가 할당되고 컨테이너에 할당된 eth0 인터페이스와 통신하게 됩니다.

veth 인터페이스는 docker0와 바인딩되고 docker0는 호스트의 eth0 인터페이스와 연결되어 외부로부터 들어온 요청을 처리합니다.

 

Docker Compose 설정

다음은 coturn 테스트 환경 구축 방법입니다.

coturn/coturn:4.6 이미지에는 telnet, wget, curl 과 같은 도구가 설치되어 있지 않아서 새로운 이미지를 생성하였습니다.

 

Dockerfile 설정

FROM coturn/coturn:4.6

USER root

RUN apt-get update \\
    && apt-get install -y telnet \\
	  && apt-get install -y net-tools \\
	  && apt-get install -y wget \\
	  && apt-get install -y curl \\
    && rm -rf /var/lib/apt/lists/*

Dockerfile을 실행하여 martin/coturn 이미지를 생성하였습니다.

 

docker-compose.yaml 설정

version: '3.4'

services:

  coturn1:
    image: martin/coturn:4.6
    container_name: coturn1
    networks:
      mynet:
        ipv4_address: 172.28.0.10
    ports:
      - "3478:3478"
      - "3478:3478/udp"
      - "5349:5349"
      - "5349:5349/udp"
      - "49160-49200:49160-49200/udp"
    environment:
      - TURN_USER=test
      - TURN_PASSWORD=1234
    volumes:
      - ./coturn1.conf:/etc/coturn/turnserver.conf
    restart: on-failure

  coturn2:
    image: martin/coturn:4.6
    container_name: coturn2
    networks:
      mynet:
        ipv4_address: 172.28.0.11
    ports:
      - "3479:3479"
      - "3479:3479/udp"
      - "5350:5350"
      - "5350:5350/udp"
      - "49260-49300:49260-49300/udp"
    environment:
      - TURN_USER=test
      - TURN_PASSWORD=1234
    volumes:
      - ./coturn2.conf:/etc/coturn/turnserver.conf
    restart: on-failure

  nginx:
    image: nginx
    container_name: nginx
    networks:
      mynet:
        ipv4_address: 172.28.0.12
    ports:
      - 7979:80
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    restart: on-failure

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

 

coturn1.conf 설정

listening-port=3478
tls-listening-port=5349
min-port=49160
max-port=49200

fingerprint
realm=localhost
user=test:1234
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers
external-ip=172.28.0.10

log-file=/var/tmp/turnserver.log
verbose
log-level=4

cli-ip=127.0.0.1
cli-port=5766
cli-password=1234

allocation-lifetime=100
channel-lifetime=600

 

coturn2.conf 설정

listening-port=3479
tls-listening-port=5350
min-port=49260
max-port=49300

fingerprint
realm=localhost
user=test:1234
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers
external-ip=172.28.0.11

log-file=/var/tmp/turnserver.log
verbose
log-level=4

cli-ip=127.0.0.1
cli-port=5766
cli-password=1234

allocation-lifetime=100
channel-lifetime=600

 

coturn 환경을 로컬에 구성하는 방법에 대해서 알아보았습니다.

 

 

Docker 컨테이너와 호스트 머신간의 통신

Coturn 컨테이너 내부에 접속해 보겠습니다.

컨테이너 내부에서 wget 명령어를 이용하여 구글 사이트를 호출해 보겠습니다.

# wget google.com

 

docker는 기본적으로 호스트 시스템의 DNS 설정을 사용하거나, docker의 DNS 설정을 따릅니다.

컨테이너 내부의 패킷은 docker0 브리지를 통해 호스트 시스템의 네트워크 스택으로 전달됩니다.

호스트 시스템은 해당 패킷을 외부 네트워크로 라우팅합니다.

이는 호스트 시스템의 물리적 네트워크 인터페이스(eth0)를 통해 이루어집니다.

호스트 시스템은 수신한 응답 패킷을 docker0 브리지를 통해 해당 컨테이너로 전달합니다.

패킷을 라우팅하는 과정을 요약하면 다음과 같습니다.

 

HTTP Request : 컨테이너 → docker0 브리지 → 호스트 eth0 → 인터넷 → 구글 서버

HTTP Response : 구글 서버 → 호스트 eth0 → docker0 브리지 → 컨테이너

 

'WebRTC' 카테고리의 다른 글

WebRTC의 ICE Candidate 처리 순서 문제  (0) 2024.12.26
NAS에 TURN 서버 구축하기  (1) 2024.12.20
TURN 서버를 통한 Relay 통신 원리  (0) 2024.12.10
NAT 종류에 따른 홀펀칭  (3) 2024.11.12
NAT 종류  (0) 2024.11.03