🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

img


前言

WebRTC(Web Real-Time Communication)已成为实时音视频通信的核心技术,但其部署涉及信令服务、媒体服务器(如Kurento、Janus)、STUN/TURN服务等复杂组件。本文通过Docker容器化方案,实现一键部署高可用WebRTC服务集群,解决传统部署中环境依赖、横向扩展、资源隔离等痛点。

适用场景

  • 视频会议系统
  • 在线教育平台
  • 远程医疗实时交互
  • 低延迟直播推流

技术栈

  • 信令服务器:Node.js + Socket.IO
  • 媒体服务器:Kurento Media Server(或Janus Gateway)
  • TURN服务:coturn
  • 容器编排:Docker Compose

一、环境准备

1. 服务器要求

  • 操作系统:Ubuntu 20.04+/CentOS 8+
  • 内核支持:开启cgroupnamespaces
  • 硬件配置:
    • CPU:4核+(推荐支持硬件加速的Intel/AMD芯片)
    • 内存:8GB+
    • 带宽:100Mbps+(按实际并发调整)

2. 安装Docker及插件

# 安装Docker引擎  
curl -fsSL https://get.docker.com | bash -s docker  

# 安装Docker Compose  
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
sudo chmod +x /usr/local/bin/docker-compose  

# 验证安装  
docker --version && docker-compose --version  

二、核心服务容器化部署

1. 部署TURN服务器(coturn)

作用:解决NAT穿透问题,提供中继服务。

docker-compose.yml配置

services:
  coturn:
    image: instrumentisto/coturn
    container_name: coturn
    network_mode: host  # 需直接暴露UDP端口
    environment:
      - TURN_SECRET=your_shared_secret
      - TURN_USERNAME=user
      - TURN_PASSWORD=pass
      - TURN_REALM=your.domain.com
    command: |
      --min-port=40000
      --max-port=50000
      --log-file=stdout
      --verbose
    restart: unless-stopped

2. 部署媒体服务器(Kurento)

作用:处理媒体流的路由、编解码及录制。

docker-compose.yml配置

services:
  kurento:
    image: kurento/kurento-media-server:latest
    container_name: kurento
    ports:
      - "8888:8888/tcp"    # WebSocket信令端口
      - "5000-5050/udp"    # RTP/RTCP端口范围
    volumes:
      - /etc/group:/etc/group:ro
      - /etc/passwd:/etc/passwd:ro
    environment:
      - KMS_UID=$(id -u)
      - KMS_GID=$(id -g)
    restart: unless-stopped

3. 部署信令服务器(Node.js)

代码示例

// server.js
const express = require('express');
const { createServer } = require('http');
const { Server } = require('socket.io');

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { cors: { origin: '*' } });

io.on('connection', (socket) => {
  socket.on('join', (roomId) => {
    socket.join(roomId);
    socket.to(roomId).emit('new-user', socket.id);
  });

  socket.on('sdp-offer', (offer, roomId) => {
    socket.to(roomId).emit('sdp-offer', offer, socket.id);
  });
});

httpServer.listen(3000, () => console.log('Signaling server running on port 3000'));

Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

4. 整合服务(完整docker-compose.yml)

version: '3.8'

services:
  coturn:
    # ...同上coturn配置...

  kurento:
    # ...同上Kurento配置...

  signaling:
    build: ./signaling-server  # 指向信令服务器Dockerfile目录
    ports:
      - "3000:3000"
    depends_on:
      - kurento
    environment:
      - KMS_WS_URI=ws://kurento:8888/kurento
      - TURN_SERVER=turn:your.domain.com:3478
      - TURN_USER=user
      - TURN_PASSWORD=pass

三、客户端对接示例

前端WebRTC连接代码片段

<script>
const peerConnection = new RTCPeerConnection({
  iceServers: [{
    urls: "turn:your.domain.com:3478",
    username: "user",
    credential: "pass"
  }]
});

// 信令交互
socket.on('sdp-offer', async (offer, senderId) => {
  await peerConnection.setRemoteDescription(offer);
  const answer = await peerConnection.createAnswer();
  await peerConnection.setLocalDescription(answer);
  socket.emit('sdp-answer', answer, roomId, senderId);
});
</script>

四、性能优化与高可用

1. 横向扩展方案

  • 媒体服务器集群
    docker-compose scale kurento=3  # 启动3个Kurento实例
    
  • 负载均衡:使用Nginx分发信令请求
    upstream kurento_cluster {
      server kurento1:8888;
      server kurento2:8888;
      server kurento3:8888;
    }
    

2. 硬件加速配置

启用GPU编解码(需NVIDIA Docker环境):

services:
  kurento:
    runtime: nvidia  # 使用NVIDIA容器运行时
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - GST_VAAPI_DRM_DEVICE=/dev/dri/renderD128

五、常见问题排查

1. ICE连接失败

  • 检查项
    • TURN服务器端口(UDP 3478/40000-50000)是否开放
    • coturn日志:docker logs coturn
    • 使用TRICKE ICE测试工具验证配置

2. 媒体流卡顿

  • 优化方向
    • 调整Kurento的videoMinRecvBandwidth/videoMaxRecvBandwidth
    • 启用BBR拥塞控制:
      sysctl -w net.ipv4.tcp_congestion_control=bbr
      

六、完整项目代码

GitHub仓库地址 包含:

  • 信令服务器完整代码
  • Docker Compose模板
  • 客户端示例

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐