操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
Docker版本:23.0.6
 
使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的故障恢复来说,仅实现docker打包是不够的,打包的docker镜像需要支持”根据提供的参数动态启动FreeSWITCH实例“,至少完成如下动作:
  • 根据提供的IP、端口等信息启动服务
  • 访问指定的数据库,获取信息并进行通话恢复
今天记录下CentOS 7环境下使用docker构建可动态启动FreeSWITCH实例的过程。本文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。 
如何使用docker构建FreeSWITCH编译环境及打包,可以参考我之前的文章:

一、整体结构

这里提供一个FreeSWICH高可用实例的结构图,其中数据库使用的是MySQL数据库,整体结构如下:

说明:
1)打包的docker镜像具备通用性,可根据不同的参数启动不同的FreeSWITCH实例,其中启动参数存储在环境参数里面;
2)主机、备机通过VIP对外提供服务,VIP在同一时刻只在一台机器上,可通过keepalived等工具实现VIP漂移(也可自己写脚本实现,具体实现这里就不展开了);
3)主机、备机连接同一个MySQL库,共享数据库信息(配置数据、运行数据);
4)主机、备机具备同样的环境参数(fs-env文件);
5)主机、备机具备同样的配置文件(conf、scripts等);

二、具体实现

1、FreeSWICH支持MySQL

MySQL版本:5.7.38
1)安装odbc驱动
apt install unixodbc unixodbc-dev
 
找不到debian11的驱动,下载debian10的驱动实测也可以使用。

安装命令如下:

cd mysql-connector-odbc-5.3.14-linux-debian10-x86-64bit/lib
cp libmyodbc5* /usr/local/lib/
./myodbc-installer -d -a -n "MYSQL" -t "DRIVER=/usr/local/lib/libmyodbc5w.so;SETUP=/usr/lib/libmyodbc5w.so"
/ect/odbcinst.ini 内容如下:
[MYSQL]
Driver=/usr/local/lib/libmyodbc5w.so
SETUP=/usr/local/lib/libmyodbc5w.so
UsageCount=1
/ect/odbc.ini文件内容如下:
[fsdb]
Driver=MYSQL
Description=database for mysql
SERVER=192.168.137.1
CHARSET=UTF8
PORT=3306
USER=root
PASSWORD=123456
Database=fsdb
OPTION=67108864
2)配置odbc及测试连接
isql -v fsdb

3)编译、安装及配置odbc-dsn

 需要开启odbc支持:
./configure --enable-core-odbc-support
需要修改odbc-dsn信息:
对应变量:
odbc-dsn
core-db-dsn --- 仅switch.conf.xml
示例:
<param name="odbc-dsn” value=”fsdb:root:123456”/>
<param name="core-db-dsn” value=”fsdb:root:123456”/>
对应文件:
/usr/local/freeswitch/conf/autoload_configs/switch.conf.xml
/usr/local/freeswitch/conf/autoload_configs/db.conf.xml
/usr/local/freeswitch/conf/autoload_configs/callcenter.conf.xml
/usr/local/freeswitch/conf/autoload_configs/voicemail.conf.xml
/usr/local/freeswitch/conf/sip_profiles/internal.xml
/usr/local/freeswitch/conf/sip_profiles/external.xml
/usr/local/freeswitch/conf/autoload_configs/fifo.conf.xml
 
/usr/local/freeswitch/conf/vars.xml的配置: 
<X-PRE-PROCESS cmd="set" data="json_db_handle=odbc://fsdb:root:123456"/>

2、docker容器支持绑定非本机ip地址

vip同一时刻只能在一台机器上,docker容器所使用的vip可能没有漂过来,需要开启非本机绑定。
临时生效:
sysctl -w net.ipv4.ip_nonlocal_bind=1
永久生效:
echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf
 
说明:
1)vip切换
可以使用keepalived等工具,具体细节这里不展开了。
2)arp广播
如果使用keepalived等工具,该部分忽略。
切换vip后,需要发送arp广播,以便vip实时生效
arping -U 192.168.137.201 -I eth0 -w 2

3、配置文件动态获取运行参数

整体流程如下:
生成env文件及odbc文件 =》 docker设置env信息 -》 fs读取env配置

3.1 xml关键变量需要通过环境变量设置

可通过freeswitch提供的env-set命令获取linux系统环境变量,示例如下:

<X-PRE-PROCESS cmd="env-set" data="force_local_ip_v4=$docker_fs_local_ip_v4"/>

其中,docker_fs_local_ip_v4是Linux系统环境变量。

具体使用方法可参考freeswitch官方wiki:

var.xml是最先加载,可以在该文件设置全局参数,示例如下:

3.2 设置启动映射conf目录

可通过docker启动参数设置:
-v /app/conf:/usr/local/freeswitch/conf
其中, /app/conf 为宿主机的目录,/usr/local/freeswitch/conf 为docker容器的目录。

3.3 动态生成odbc配置信息

odbc.ini文件里面有mysql的ip地址等信息,该部分需要动态生成:
1)动态生成odbc.ini文件;
2)将odbc.ini文件放在freeswitch的conf目录;
3)将/etc/odbc.ini链接到 /usr/local/freeswitch/conf/odbc.ini
 
xml文件的odbc配置示例如下:

3.4、lua脚本动态获取全局变量

示例如下:
my_globalvar = freeswitch.getGlobalVariable("varname")
运行效果如下:

可参考wiki:

4、Dockerfile及启动脚本

1)需要在Dockefile中安装依赖文件并进行打包;

2)启动时需要指定docker的环境信息;

具体实现可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。 

三、运行效果

需要设置env文件,示例如下:
docker_fs_local_ip_v4=192.168.137.201
docker_fs_external_ip_v4=192.168.137.201
docker_fs_internal_sip_port=15060
docker_fs_external_sip_port=15080
docker_fs_rtp_start_port=20000
docker_fs_rtp_end_port=30000
docker_fs_odbc_dsn=fsdb
docker_fs_odbc_dsn_full=fsdb:root:123456
docker_fs_odbc_ip=192.168.137.1
docker_fs_odbc_port=3306
docker_fs_switch_name=fstest1
需要映射目录,app目录结构如下:

启动效果如下:

运行效果视频可以从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 2023071601 获取。 

四、资源下载

 文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。 

 

使用docker构建可动态启动的FreeSWITCH实例的更多相关文章

  1. docker挡板程序实现启动多个实例进程

    启动服务: docker-compose restart

  2. freeswitch的docker构建过程

    概述 Docker是一个开源的应用容器引擎,可以让开发者打包应用以及依赖包到一个轻量级.可移植的容器中,并在任何安装有Docker的机器上运行. Docker 使你能够将应用程序与基础架构分开,从而可 ...

  3. 使用Spring Cloud和Docker构建微服务架构

    原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do 作者:Alexander Lukyan ...

  4. 使用 Spring Cloud 和 Docker 构建微服务架构

    如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...

  5. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  6. angular 构建可以动态挂载的配置服务

    angular 构建可以动态挂载的配置服务 Intro 在 angular 中可以指定 environment 来区分不同环境下的配置,然而 environment 中的配置会在打包时是固定的,想要像 ...

  7. Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...

  8. Docker构建Python Web环境

    出于寻找Docker对Python相关项目部署的学习,找到腾讯课堂NEXT公开课中[Docker构建Python Web环境]的课程,本文对其进行内容梳理及知识点汇总. 该课程总计6小时左右,是个适合 ...

  9. 基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

    WoodpeckerCI 是一个由社区维护的 DroneCI 分支,使用 Apache License 2.0 许可证发布.社区版进一步扩展了 pipeline 的功能特性.支持对文件路径设置 pip ...

  10. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

随机推荐

  1. Sql批量替换字段字符,Sql批量替换多字段字符,Sql替换字符

    update phome_ecms_news_check set filename= replace(filename,'Under4-',''); update phome_ecms_news_ch ...

  2. MAPPO学习笔记(2) —— 从MAPPO论文入手

    在有了上一节一些有关PPO算法的概念作为基础后,我们就可以正式开始对于MAPPO这一算法的学习. 那么,既然要学习一个算法,就不得不去阅读提出这一算法的论文.那么本篇博客将从MAPPO的论文出发,对M ...

  3. boot-admin整合Quartz实现动态管理定时任务

    淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉.烤串.小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据设定的Trigger ...

  4. This application failed to start because it could not find or load the Qt platforms plugins

     由于一直在linux下操作,今天Qt移植平台的时候导致.exe可执行文件一直运行不起来,提示缺少某些dll库,这个问题解决起来简单(直接去qt源码里面查找对应库添加到可执行文件目录就行),但是之后一 ...

  5. 2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m 的数组 queries 你必须在树上执行

    2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m 的数组 queries 你必须在树上执行 ...

  6. [UR #14]人类补完计划

    计数好题. 题意:给定简单无向图 \(G=(V,E),|V|=n,|E|=m\),有 \(n\leq 16,m\leq {n\choose 2}\),求所有为基环树的子图的权值之和.一个基环树的权值定 ...

  7. 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {

    2022-09-04:以下go语言代码输出什么?A:不能编译:B:45:C:45.2:D:45.0. package main import ( "fmt" ) func main ...

  8. 2022-02-02:最接近的二叉搜索树值 II。 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。 注意: 给定的目标值 ta

    2022-02-02:最接近的二叉搜索树值 II. 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值. 注意: 给定的目标值 tar ...

  9. 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》

    在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢? 再次回顾考察,看下面的查询子句: Id>1 and Id<10 如上所示,有两个独立的条件分别为Id ...

  10. drf——jwt

    jwt原理 使用jwt认证和使用session认证的区别 三段式 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibm ...