ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

使用 Docker 部署 Kamailio:从官方镜像到 SIP Proxy 实战

使用 Docker 部署 Kamailio:从官方镜像到 SIP Proxy 实战 Kamailio 是一个高性能、可扩展的 SIP Server广泛应用于 SIP Proxy、Registrar、负载均衡、路由控制以及 VoIP 核心网络。对于已经熟悉 Docker 的开发者来说使用容器运行 Kamailio 可以避免直接在 Linux 主机上安装大量依赖同时也方便进行版本管理、配置管理和环境迁移。本文介绍如何使用 Kamailio 官方 Docker 镜像快速部署一个 SIP Proxy并进一步介绍 Kamailio 与 FreeSWITCH 配合使用的典型架构。1. Kamailio Docker 镜像Kamailio 官方提供了 Docker 镜像。目前官方镜像主要发布在 GitHub Container RegistryGHCRdockerpull ghcr.io/kamailio/kamailio:latest官方 Docker 项目Kamailio Docker GitHub Repository可以先检查镜像dockerimages|grepkamailio例如ghcr.io/kamailio/kamailio latest xxxxx ...生产环境不建议长期使用latest最好固定到具体版本。例如dockerpull ghcr.io/kamailio/kamailio:6.0具体可用的 Tag 可以在官方镜像仓库中确认。2. 最简单的运行方式Kamailio 是 SIP Server因此除了 SIP 端口之外还需要考虑 RTP。需要注意的是Kamailio 本身通常不负责 RTP Media。它主要处理 SIP signaling。因此一个简单的 Kamailio 容器可以这样启动dockerrun-d\--namekamailio\--networkhost\ghcr.io/kamailio/kamailio:latest这里使用--network host对于 SIP Server 非常方便。因为 SIP 通常涉及UDP 5060 TCP 5060 TLS 5061如果使用 Docker bridge network则需要额外配置端口映射。对于生产环境中的 SIP ProxyHost Network 往往能够减少 NAT、端口映射以及 SIP Contact/Via 地址处理方面的问题。3. 为什么 SIP Server 更适合考虑 Host Network普通 Web 服务通常可以这样Internet | v Docker Host | ---- 8080 - Container 80但是 SIP 比较特殊。例如INVITE sip:1001example.com SIP/2.0 Via: SIP/2.0/UDP 10.0.0.10:5060 Contact: sip:100110.0.0.10:5060SIP 消息里面本身就包含 IP 地址和端口。如果 Docker 使用 NATInternet | v Host:5060 | Docker NAT | v Container:5060就可能需要处理ViaContactRecord-RouteSDPNAT traversalsource IPadvertised IP因此对于一个直接暴露 SIP 服务的 Kamailio 实例dockerrun--networkhost...通常是一个比较简单可靠的方案。4. 使用自己的 Kamailio 配置实际部署中不应该直接使用容器内部的默认配置。通常把配置文件放到 Host/opt/kamailio/ ├── kamailio.cfg ├── tls.cfg └── dispatcher.list然后通过 Volume Mount 到容器。例如dockerrun-d\--namekamailio\--networkhost\-v/opt/kamailio:/etc/kamailio\ghcr.io/kamailio/kamailio:latest这样Host /opt/kamailio/kamailio.cfg | | volume mount v Container /etc/kamailio/kamailio.cfg修改配置后可以重新加载或者重启容器。5. 一个最简单的 Kamailio 配置下面是一个非常简单的 SIP Proxy 示例。#!KAMAILIO listenudp:0.0.0.0:5060 loadmodule sl.so loadmodule tm.so loadmodule rr.so loadmodule maxfwd.so loadmodule textops.so request_route { if (!mf_process_maxfwd_header(10)) { sl_send_reply(483, Too Many Hops); exit; } if (is_method(OPTIONS)) { sl_send_reply(200, OK); exit; } if (is_method(INVITE|REGISTER)) { record_route(); } if (!t_relay()) { sl_reply_error(); } exit; }这里最核心的是t_relay();Kamailio 收到 SIP Request 后可以根据路由逻辑决定下一跳然后把 SIP 消息转发出去。6. Kamailio FreeSWITCHKamailio 最常见的应用之一就是作为 FreeSWITCH 前面的 SIP Proxy。一个典型架构Internet | | SIP INVITE | v ---------------- | Kamailio | | SIP Proxy | --------------- | | v ---------------- | FreeSWITCH | | Media Server | ---------------- | | RTP / MediaKamailio 负责SIP RoutingRegistrarAuthenticationLoad BalancingFailoverDispatcherNAT handlingSIP filteringSIP topology controlFreeSWITCH 负责MediaBridgeIVRRecordingConferencePlaybackApplication logic这样可以把SIP Signaling和Media Processing分离。7. Kamailio 多个 FreeSWITCH当 FreeSWITCH 数量增加以后Kamailio 的优势更加明显。例如Internet | v --------------- | Kamailio | | SIP Proxy/LB | -------------- | ---------------------------- | | | v v v --------- --------- --------- | FS-1 | | FS-2 | | FS-3 | --------- --------- ---------Kamailio 可以通过 dispatcher 等模块实现SIP | ---- FS-1 | ---- FS-2 | ---- FS-3例如loadmodule dispatcher.so modparam(dispatcher, list_file, /etc/kamailio/dispatcher.list)dispatcher.list1 sip:10.10.10.101:5060 1 sip:10.10.10.102:5060 1 sip:10.10.10.103:5060然后在 Kamailio 中ds_select_dst(1, 4); t_relay();就可以根据 Dispatcher 的策略选择 FreeSWITCH 节点。8. 使用 Docker Compose如果 Kamailio 和 FreeSWITCH 都运行在 Docker 中可以使用 Docker Compose 管理。例如services:kamailio:image:ghcr.io/kamailio/kamailio:latestcontainer_name:kamailionetwork_mode:hostvolumes:-./kamailio:/etc/kamailiorestart:unless-stoppedfreeswitch:image:my-freeswitch:latestcontainer_name:freeswitchnetwork_mode:hostrestart:unless-stopped启动dockercompose up-d查看dockercomposeps查看 Kamailio 日志dockerlogs-fkamailio进入容器dockerexec-itkamailiobash9. 查看 Kamailio 运行状态可以首先检查容器dockerps然后检查 SIP 端口ss-lunp|grep5060或者ss-lntup|grep5060也可以直接使用sngrepsngrep这对于 SIP 问题定位非常方便。例如INVITE Client ---------------- Kamailio INVITE Client ---------------- Kamailio INVITE Kamailio --------------- FreeSWITCH通过sngrep可以非常直观地看到 SIP signaling。10. Docker 环境中的日志Kamailio 的日志通常可以直接输出到 Docker stdout/stderr。因此dockerlogs kamailio就可以查看。实时查看dockerlogs-fkamailio如果需要生产环境日志管理可以进一步接入Docker | ---- Fluent Bit | ---- Elasticsearch | ---- Loki | ---- Cloud logging这样 Kamailio 本身不需要负责复杂的日志轮转。11. 不要把 SIP Server 和 RTP 混为一谈这是部署 Kamailio 时非常容易踩的坑。KamailioSIP SignalingFreeSWITCHSIP RTP Media Application如果架构是Client | | SIP v Kamailio | | SIP v FreeSWITCH那么 Kamailio 不一定需要看到 RTP。媒体可以Client FreeSWITCH RTP这也是 Kamailio FreeSWITCH 架构比较常见的原因。12. Docker 部署 Kamailio 的几个注意事项12.1 固定版本生产环境不要image:ghcr.io/kamailio/kamailio:latest更建议image:ghcr.io/kamailio/kamailio:6.x.x这样升级不会因为latest自动变化而导致生产环境行为发生变化。12.2 配置文件不要写进 Image不推荐COPY kamailio.cfg /etc/kamailio/如果配置经常变化更适合Host | -- kamailio.cfg | -- dispatcher.list | -- tls.cfg | -- docker compose通过 Volume 注入。这样升级 Image 不会影响配置。12.3 SIP 服务需要特别关注网络模式如果使用bridge需要认真处理SIP NAT RTP Contact Via advertised address如果部署环境允许直接network_mode:host通常更加简单。13. 总结使用官方 Kamailio Docker 镜像可以把传统的Linux | -- Kamailio -- dependencies -- configuration转换成Docker Host | ------------------- | Kamailio | | Docker | -------------------进一步结合 FreeSWITCHSIP | v ----------- | Kamailio | | Docker | ---------- | SIP | v ----------- |FreeSWITCH | | Docker | ----------- | RTP这种架构尤其适合SIP ProxySIP RegistrarSIP Load BalancerFreeSWITCH 集群VoIP SBC 前端SIP Failover多 FreeSWITCH 节点路由开发/测试环境快速搭建对于已经使用 Docker 的 VoIP 环境Kamailio 容器化最大的价值并不是“把 Kamailio 放进 Docker”而是让 SIP Routing 层和 Media Server 层拥有独立的生命周期、版本和扩缩容能力。
返回列表