用 Docker 快速部署 Janus WebRTC Server:从零到可用的完整实战指南 用 Docker 快速部署 Janus WebRTC Server从零到可用的完整实战指南【免费下载链接】janus-gatewayJanus WebRTC Server项目地址: https://gitcode.com/GitHub_Trending/ja/janus-gatewayJanus WebRTC Server 源码直接编译意味着你要手动备齐 GLib、libnice、libsrtp、libwebsockets、sofia-sip 等十多项依赖每个库的 ABI 版本还容易和发行版打架光是./configure反复排错就能耗掉一个下午。Docker 部署 Janus 的思路是把这套环境整体冻结进镜像编译在构建期一次完成运行期只装运行库docker compose up一条命令就能把媒体服务器跑起来。二、动手前先把三个决策想清楚这一步解决的是避免容器跑起来之后才发现网络方案不对的问题。Janus 是媒体服务器UDP 流量和端口规划不提前定后面改起来要动 SDP 协商链路远比改一行端口映射麻烦。1. 网络模型host 网络 vs 端口映射方案优点代价network_mode: host无 NAT 嵌套ICE 行为与裸机部署一致媒体端口直接可见端口与宿主机冲突容器失去网络隔离端口映射-p隔离干净可同机多实例媒体端口段必须逐段映射且部分客户端在双层 NAT 下 ICE 失败率上升单机自用、测试环境推荐 host 网络能砍掉一大类宿主机能通、容器里不通的玄学问题。2. 媒体端口范围Janus 在[media]段用rtp_port_range声明 UDP 端口池示例配置见 conf/janus.jcfg.sample.in默认从 20000 开始。你的规则选一段连续、防火墙愿意全放的端口比如 30000-40000容器内配置和宿主机防火墙/安全组三处保持一致。只放 API 端口不放媒体端口是新手最常见的坑。3. NAT 与公网 IP如果你的服务器在 NAT 后面绝大多数云服务器、家用宽带都是Janus 通告的 host candidate 会是内网 IP对端必然连不回来。解法是在[nat]段配置nat_1_1_mapping指向公网地址。现在只需要确认一件事你的机器有没有固定的公网 IP有就填没有就规划用 TURN 兜底。三、主线流程从安装到容器启动这条主线按动作顺序走一遍中间任何一步卡住都先解决再往下。第 1 步安装 Docker 与 Compose。大多数发行版仓库里都有现成包一条命令装完即可# Debian/Ubuntu 示例其他发行版换成对应仓库 sudo apt-get update sudo apt-get install -y docker.io docker-compose-v2 sudo systemctl enable --now docker第 2 步编写 Dockerfile。这一步解决编译依赖不进最终镜像的问题所以用多阶段构建第一阶段装全部编译工具链并产出二进制第二阶段只复制运行库。注意两个点libnice 走 meson 源码编译libwebsockets 走 cmakeJanus 本体走 autotools三者工具链互不干扰最终FROM同一基础镜像省去维护两套包版本。# 第一阶段纯编译环境产物留在 /opt/janus 和 /usr/lib 里 FROM ubuntu:22.04 AS builder RUN apt-get update apt-get install -y --no-install-recommends \ build-essential meson ninja-build cmake git pkg-config \ libmicrohttpd-dev libjansson-dev libssl-dev libsrtp2-dev \ libsofia-sip-ua-dev libglib2.0-dev libopus-dev libogg-dev \ libcurl4-openssl-dev libconfig-dev libwebsockets-dev \ rm -rf /var/lib/apt/lists/* # libnice 是 apt 版本的头号坑源码编译可跳过版本滞后问题 RUN git clone https://gitlab.freedesktop.org/libnice/libnice.git \ meson setup --prefix/usr build libnice \ ninja -C build install # 源码与编译仓库地址为任务约定地址 WORKDIR /usr/src RUN git clone https://gitcode.com/GitHub_Trending/ja/janus-gateway \ cd janus-gateway sh autogen.sh \ ./configure --prefix/opt/janus \ --enable-websockets --enable-rest --enable-data-channels \ --enable-post-processing --disable-docs \ make -j$(nproc) make install make configs # 第二阶段只带运行库镜像体积砍掉一大截 FROM ubuntu:22.04 RUN apt-get update apt-get install -y --no-install-recommends \ libmicrohttpd12 libjansson4 libssl3 libsrtp2-1 libsofia-sip-ua0 \ libglib2.0-0 libopus0 libogg0 libcurl4 libconfig9 libwebsockets18 \ libnice2 \ rm -rf /var/lib/apt/lists/* COPY --frombuilder /opt/janus /opt/janus COPY --frombuilder /usr/lib/x86_64-linux-gnu/libnice.so* /usr/lib/x86_64-linux-gnu/ COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh EXPOSE 8088 8188 30000-40000/udp ENTRYPOINT [/entrypoint.sh]第 3 步写 entrypoint 脚本。它的作用是把首次启动初始化配置和日志目录权限收敛到容器启动前避免你每次进容器手动 mkdir#!/bin/bash set -e mkdir -p /opt/janus/logs # 首次启动时把模板配置铺到可写挂载点 if [ ! -f /opt/janus/etc/janus/janus.jcfg ]; then cp /opt/janus/etc/janus/*.jcfg.sample /opt/janus/etc/janus/ for f in /opt/janus/etc/janus/*.jcfg.sample; do mv $f ${f%.sample} done fi exec /opt/janus/bin/janus $第 4 步构建镜像。首次构建会把源码编译全量跑一遍耗时取决于机器核心数别中途打断docker build -t janus-gateway:local .第 5 步首次启动。用 compose 描述编排配置、日志、录像三个目录挂出来后续改配置不用重打镜像services: janus: image: janus-gateway:local container_name: janus restart: always network_mode: host # 前面决策 1 的 host 方案 volumes: - ./janus-conf:/opt/janus/etc/janus - ./janus-logs:/opt/janus/logs - ./recordings:/opt/janus/var/recordingsdocker compose up -d docker compose logs -f # 看到各插件加载完毕即启动成功四、配置详解janus.jcfg 真正需要动的几处这一步解决默认配置直接对外服务的隐患。完整字段说明在 conf/janus.jcfg.sample.in这里只挑高频项general: { debug_level 4 # 0-7生产建议 2排障时临时调 4 #api_secret 换成你自己的随机串 # 每个 API 请求必须携带 #token_auth true # 按会话粒度鉴权配合 admin API 签发 } nat: { stun_server stun.l.google.com stun_port 3478 #nat_1_1_mapping 你的公网IP # NAT 后部署必配见第二节决策 3 } media: { rtp_port_range 30000-40000 # 与防火墙、宿主机规则三处一致 }两个生产参数的分工api_secret是实例级门槛防陌生请求碰你的 Janustoken_auth是用户级鉴权让每个 Web 客户端带独立 token。只上api_secret适合内部服务公网暴露建议两者都开。nat_1_1_mapping注意填了它host candidate 会被改写成公网 IP若还想同时保留私网 candidate配套设keep_private_host true。五、验证三板斧启动成功不等于服务可用用下面三步逐层确认。1. 进程与端口。容器内确认 janus 活着宿主机确认端口在听docker exec janus ps aux | grep [j]anus ss -ulpn | grep 30000-40000 # host 网络下直接看宿主机即可2. API 存活。这是最便宜的功能测试一条 curl 能同时验证 HTTP 传输、插件加载和 API secretcurl -s http://127.0.0.1:8088/janus/info?api_secret你的secret返回体里janus: server_info、plugins数组包含 echotest/videoroom、transports包含 http 与 websockets三项齐了说明核心链路通。3. 端到端 Echo Test。仓库自带演示页在 html/demos/ 目录把整个目录丢进任意静态服务器nginx 即可浏览器打开index.html选 Echo Test授权摄像头麦克风Start 之后几秒内看到自己的画面和听到自己的声音说明 SDP 协商、ICE 连通、RTP 收发全链路正常。这是容器化部署里最容易被跳过、但最有用的一步。六、排障手册现象大概率原因处理ICE 一直 candidate gathering最后超时STUN 不可达或防火墙挡了 UDP先nc -uvz stun.l.google.com 3478测通不通就换可达的 STUN或在[nat]配 TURN 兜底信令正常但媒体黑屏/无声宿主机只放了 8088rtp_port_range段没放行防火墙/安全组按完整 UDP 端口段放行别只开 API 端口局域网内互通、跨网段/公网必挂没配nat_1_1_mappinghost candidate 是内网 IP[nat]段填公网 IP客户端侧配 TURN 作为最终兜底音视频不同步、偶发卡顿系统时间漂移导致 RTP 时间戳错乱宿主机与容器都启用 NTP/chrony 同步启动秒退日志刷cannot open shared object第二阶段镜像漏拷某个运行库docker run --rm --entrypoint sh janus-gateway:local -c ldd /opt/janus/bin/janus \| grep not found定位缺失库补进 Dockerfile七、进阶与收尾跑稳之后资源与内核参数是下一轮优化点。compose 里加限额防单实例吃光宿主机services: janus: # ... deploy: resources: limits: { cpus: 4, memory: 4G }媒体密集场景把 UDP 缓冲区调大同样写进 composesysctls: - net.core.rmem_max26214400 - net.core.wmem_max26214400日志方面docker compose logs本身有截断风险长期运行建议把 Janus 的log_to_file指到挂载目录再配一段 logrotatedaily/rotate 7/compress或者直接用带 rotation 的 logging driver。再往后Janus 的多实例水平扩展、K8s 上的 StatefulSet 编排、以及通过 event handlers 把媒体统计喂给 Prometheus 做监控都是容器化之后的自然延伸——但那些等你先把单机这套跑稳了再说。【免费下载链接】janus-gatewayJanus WebRTC Server项目地址: https://gitcode.com/GitHub_Trending/ja/janus-gateway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考