docker 基于Debian镜像安装FreeSwitch1.10.7

文章目录

  • 一、安装docker
    • [1.1 卸载旧版本的Docker](#1.1 卸载旧版本的Docker)
    • [1.2 安装最新版本的docker](#1.2 安装最新版本的docker)
    • [1.3 配置docker镜像源](#1.3 配置docker镜像源)
  • 二、制作FreeSwitch镜像
    • [2.1 制作开发环境FreeSwitch镜像](#2.1 制作开发环境FreeSwitch镜像)
      • [2.1.1 编写Dockerfile](#2.1.1 编写Dockerfile)
      • [2.1.2 准备FreeSwitch-1.10.7源码](#2.1.2 准备FreeSwitch-1.10.7源码)
      • [2.1.3 构建镜像](#2.1.3 构建镜像)
      • [2.1.4 生成开发基础镜像容器](#2.1.4 生成开发基础镜像容器)
      • [2.1.5 编译FreeSwitch](#2.1.5 编译FreeSwitch)
      • [2.1.6 运行](#2.1.6 运行)
    • [2.2 制作生产环境FreeSwitch镜像](#2.2 制作生产环境FreeSwitch镜像)
      • [2.2.1 编写Dockerfile](#2.2.1 编写Dockerfile)
      • [2.2.2 将开发环境里面的镜像内容复制到宿主机做准备](#2.2.2 将开发环境里面的镜像内容复制到宿主机做准备)
      • [2.2.3 构建镜像](#2.2.3 构建镜像)
      • [2.2.4 生成生产镜像容器](#2.2.4 生成生产镜像容器)

一、安装docker

本次使用的宿主机是网友提供的centos7.9

1.1 卸载旧版本的Docker

1.执行以下命令来卸载旧版本的Docker和相关的软件包,这个命令会帮您卸载掉所有列出的与Docker相关的程序。

说明 如果系统提示说部分软件包没有安装,说明您尚未安装此软件包。

bash 复制代码
sudo yum -y remove \
docker-ce \
containerd.io \
docker-ce-rootless-extras \
docker-buildx-plugin \
docker-ce-cli \
docker-compose-plugin

2.Docker默认保存位置是/var/lib/docker/,卸载Docker时,镜像、容器、存储卷和网络不会被自动删除。如果您想要删除这些数据,需要手动删除。

3.删除Docker相关源,请执行以下命令。

bash 复制代码
 
sudo rm -f /etc/yum.repos.d/docker*.repo

1.2 安装最新版本的docker

本次安装是使用阿里云的资源

  1. 更新您的包管理工具。
bash 复制代码
 
sudo yum -y update
  1. 添加阿里云源到您的实例中,这个源包含Docker软件包,方便您使用命令来安装和更新Docker。

重要 由于网络原因,如果跳过此步可能会导致您安装Docker失败。

  • 如果您的实例网络可以访问公网。
bash 复制代码
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 如果您的实例网络无法访问公网,使用VPC网络访问地址。
bash 复制代码
sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo
  1. 安装Docker社区版本,容器运行时containerd.io,以及Docker构建和Compose插件。

说明 使用Compose插件时,命令中间不用连字符,比如docker compose version。

bash 复制代码
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 启动Docker并设置Docker守护进程在系统启动时自动启动,这样可以确保每次系统启动时,Docker服务也会自动启动。

说明 如果您的systemctl命令执行异常,请参见在Linux实例中执行systemctl命令报错怎么办?

bash 复制代码
sudo systemctl start docker
sudo systemctl enable docker
  1. 通过查看Docker版本命令,验证Docker是否安装成功。
bash 复制代码
sudo docker -v

如下图回显信息所示,表示Docker已安装成功。

1.3 配置docker镜像源

  1. 修改镜像源
shell 复制代码
vim /etc/docker/daemon.json
json 复制代码
{
"registry-mirrors" :
[
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.rainbond.cc",
"http://docker.mirrors.ustc.edu.cn",
"https://axvfsf7e.mirror.aliyuncs.com",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
]
}
  1. 重新加载
shell 复制代码
 systemctl daemon-reload
  1. 查看是否生效

出现以下情况,说明生效,特别说明,如果拉不下来镜像,多试几次(如果进行拉不下来,它会轮训切换镜像源

二、制作FreeSwitch镜像

说明

这里我们制作两个镜像:1.开发镜像 2.生产镜像

这里各有优缺点,你要是用开发镜像用于生产环境,我也不拦着您,也没太大关系,无非就是大了点

区别

  • 镜像大小 :开发镜像(大) 生产镜像(小)
  • 镜像包含库 :开发镜像(开发库) 生产镜像(生产库)
  • 二次开发:开发镜像(可以) 生产镜像(不可以,但是可以将生产的好的复制进来)

共同点

  • 是否可用作生产 :开发镜像(是) 生产镜像(是)

2.1 制作开发环境FreeSwitch镜像

2.1.1 编写Dockerfile

bash 复制代码
mkdir -p /usr/local/docker/freeswitch_build
cd /usr/local/docker/freeswitch_build
vim Dockerfile

Dockerfile内容如下

bash 复制代码
FROM debian:bullseye

RUN sed -i 's/http:\/\/deb.debian.org/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list

RUN apt-get update 
RUN apt update


     

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install \
# build
    build-essential cmake automake autoconf 'libtool-bin|libtool' pkg-config gnupg2 wget lsb-release vim git \
# general
    libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \
# core
    libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \
# core codecs
    libogg-dev libspeex-dev libspeexdsp-dev \
# mod_enum
    libldns-dev \
# mod_python3
    python3-dev \
# mod_av
    libavformat-dev libswscale-dev libavresample-dev \
# mod_lua
    liblua5.2-dev lua-cjson \
# mod_opus
    libopus-dev \
# mod_mariadb
    libmariadb3 \
# mod_pgsql
    libpq-dev \
# mod_sndfile
    libsndfile1-dev libflac-dev libogg-dev libvorbis-dev \
# mod_shout
    libshout3-dev libmpg123-dev libmp3lame-dev
                


    
COPY freeswitch /usr/local/src/freeswitch

RUN ldconfig




WORKDIR /usr/local/

RUN apt-get clean && \
    apt clean && \
    apt-get purge --autoremove && \
    rm -rf /var/lib/apt/lists/*  && \
    rm -rf  /tmp/* /var/tmp/*

2.1.2 准备FreeSwitch-1.10.7源码

笔者提供了网盘给大家下载(网盘提供了所有的安装包,包括制作好的docker包)

bash 复制代码
链接: https://pan.baidu.com/s/16YDn0_vmmb6bIi0oZuoL7A?pwd=f7gv 提取码: f7gv 复制这段内容后打开百度网盘手机App,操作更方便哦

git 克隆获取

bash 复制代码
git clone https://github.com/signalwire/freeswitch.git -bv1.10.7 freeswitch

如果git有困难的,直接取官网下载

https://github.com/signalwire/freeswitch/tree/v1.10.7

然后解压一下

shell 复制代码
unzip freeswitch-1.10.7.zip 

重命名,因为Dockerfile里面写的是freeswitch

bash 复制代码
mv freeswitch-1.10.7 freeswitch 

2.1.3 构建镜像

shell 复制代码
cd /usr/local/docker/freeswitch_build
docker build -t freeswitch_build:1.10.7 .

构建完成

2.1.4 生成开发基础镜像容器

  1. 创建容器
shell 复制代码
docker run -dit \
  --name fs_build \
  --net host \
  --restart no \
  --log-driver journald \
  -v fs_build_date:/usr/local \
   freeswitch_build:1.10.7 \
  /bin/bash

逐项解析

  • docker run 是 Docker 的命令,用于创建并启动一个新的容器。

  • -d (detach): 容器将在后台运行(分离模式),终端不会被挂起,而是立即返回到命令行。

  • -i (interactive): 即使没有附加也保持 STDIN 打开,通常与 -t 一起使用以获得交互式 shell。

  • -t (tty): 分配一个伪 TTY(终端),用于提供交互式 shell 环境。

  • --name fs_build: 为容器指定自定义名称 fs_build,方便通过名字引用容器而非 ID。

  • --net host: 使用主机网络模式,容器共享主机的网络命名空间,包括所有网络接口。这提高了性能但减少了隔离性。

  • --restart no: 设置容器的重启策略为 no,即当容器停止后,Docker 不会自动重启它。

  • --log-driver journald: 指定日志驱动程序为 journald,将容器日志发送到系统日志服务,如 systemd-journald,便于集成系统级别的日志管理和监控。

  • -v fs_build_date:/usr/local: 挂载卷 fs_build_date 到容器内的 /usr/local 目录。如果卷不存在,Docker 会自动创建。卷允许在主机和容器之间共享数据,并且在容器删除后数据仍然保留。

  • freeswitch_build:1.10.7: 要运行的 Docker 镜像名称和标签,freeswitch_build 是镜像名称,1.10.7 表示版本号,指示 Docker 使用该特定版本的 FreeSWITCH 构建镜像启动容器。

  • /bin/bash: 容器启动时执行的命令,在此例中启动 Bash shell。由于使用了 -d 选项,shell 将在后台运行,可以通过 docker exec 命令稍后连接到它。

  1. 查看是否容器成功
bash 复制代码
docker ps

如图表示创建成功

2.1.5 编译FreeSwitch

1.进入容器
bash 复制代码
docker exec -it fs_build bash
2.进入源码目录编译
shell 复制代码
cd /usr/local/src/freeswitch
./bootstrap.sh -j 
./configure 

错误一:checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel package or equivalent

解决方案:安装相关包

shell 复制代码
cd /usr/local/src
git clone https://github.com/freeswitch/spandsp.git 
cd spandsp
git checkout -b finecode20230705 0d2e6ac65e0e8f53d652665a743015a88bf048d4
./bootstrap.sh -j 
./configure 
make 
make install 

安装成功

更新环境

shell 复制代码
vi ~/.bashrc

shell 复制代码
vi ~/.bash_profile

在文件末尾添加以下内容:

shell 复制代码
 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}

然后控制台执行

这样,当用户登录时,这些命令就会自动执行,从而使设置永久生效。

shell 复制代码
ldconfig

重新编译

shell 复制代码
cd /usr/local/src/freeswitch
./bootstrap.sh -j 
./configure 

错误二:checking for sofia-sip-ua >= 1.12.12... configure: error: no usable sofia-sip; please install sofia-sip-ua devel package or equivalent

解决方案:安装相关包

bash 复制代码
cd /usr/local/src/
git clone https://github.com/freeswitch/sofia-sip.git
cd sofia-sip
./bootstrap.sh
./configure
 
make
make install

ldconfig

重新编译

shell 复制代码
cd /usr/local/src/freeswitch
./bootstrap.sh -j 
./configure 
make

错误三:Makefile:977: *** You must install libks to build mod_signalwire. Stop.


解决方案:安装相关包

shell 复制代码
cd /usr/local/src
wget https://cmake.org/files/v3.13/cmake-3.13.3.tar.gz
tar -zxvf cmake-3.13.3.tar.gz
cd cmake-3.13.3 
 ./bootstrap
 make
 make install
shell 复制代码
cd /usr/local/src
git clone -bv1.8.3 https://github.com/signalwire/libks.git /usr/local/src/libks
cd libks
cmake .
make
make install

signalwire 做了一些迁移改动,所以最新版本的仓库不适应,所以要指定一下分支

shell 复制代码
cd /usr/local/src
git clone  -b1.3.0  https://github.com/signalwire/signalwire-c.git
cd signalwire-c
cmake .
make
make install
shell 复制代码
vi ~/.bashrc
shell 复制代码
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:${PKG_CONFIG_PATH}
shell 复制代码
ldconfig
ln -sf /usr/local/lib64/pkgconfig/signalwire_client.pc /usr/lib64/pkgconfig/signalwire_client.pc

cp -r /usr/local/lib/pkgconfig/*.pc /usr/lib64/pkgconfig/
cp -r /usr/local/lib/* /usr/lib64/
ldconfig
shell 复制代码
cd /usr/local/src/freeswitch
./bootstrap.sh -j 
./configure 
make && make install
ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin/
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin/

如有依赖报错,缺什么安装什么

成功如图

2.1.6 运行

启动

shell 复制代码
freeswitch -nonat -nc 

进入控制台

shell 复制代码
fs_cli

bash 复制代码
# 后台启动freeswitch服务
freeswitch -nc -rp
freeswitch -nonat -nc -rp  //不检查路由穿透行,加上此参数后会启动很快
freeswitch -stop
fs_cli
# freeswitch -help
	-help                  -- 显示本帮助信息
	-version               -- 显示版本信息
	-rp                    -- 开启高优先级(实时)设置
	-nosql                 -- 不使用SQL,show channels 类的命令将不能显示结果
	-nonat                 -- 如果路由器支持uPnP或NAT-PMP,则FreeSWITCH可以自动解决NAT穿越问题。如果路由器不支持,则该选项可以使启动更快
	-stop                  -- 关闭 FreeSWITCH,它会在run目录中查找 PID文件
	-nc                    -- 启动到后台模式,没有控制台

通话三十秒自动挂断

解决:打开/etc/freeswitch/sip_profiles下的配置文件internal.xml,将外网配置注释掉,重启FS;

2.2 制作生产环境FreeSwitch镜像

在制作之前我们可以先看一下镜像大小

如果你尚可接受

第一步将容器提交成镜像

bash 复制代码
 docker commit -a 作者名 -m 备注信息 [容器 ID] [给新的镜像命名]

第二步:保存镜像

bash 复制代码
docker save -o freeswitch1_10_7_build_dev.tar 新的镜像ID

镜像在分享的网盘里面

第三步,迁移新的机器

bash 复制代码
docker load -i  freeswitch1_10_7_build_dev.tar

启动完事

接下来,我将带领制作开发环境的

2.2.1 编写Dockerfile

因为我后面想做FS对接大模型,所以我需要python3服务

所以这里需要进入开发环境编译一下mod_python3

bash 复制代码
docker exec -it fs_build bash
bash 复制代码
 cd /usr/local/src/freeswitch/src/mod/languages/mod_python3
make
make install

如果你也有相关需求,请关注
Freeswitch-Python3开发

编写Dockerfile

bash 复制代码
mkdir -p /usr/local/docker/freeswitch_prod
cd /usr/local/docker/freeswitch_prod
vim Dockerfile

Dockerfile内容如下

shell 复制代码
FROM debian:bullseye

RUN sed -i 's/http:\/\/deb.debian.org/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list

RUN apt-get update 
RUN apt update


     

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install \
    # general 类软件包
    libssl1.1 zlib1g libdb5.3 libncurses5 libexpat1 libgdbm6 libuuid1 libsqlite3-0 libjsoncpp24 \
    # core 类软件包                 
    libcurl4 libspeex1 libspeexdsp1 libpcre3 libedit2 \
    # 额外包
    libcom-err2  libgmp10  libgnutls30  openssl \
    # 安装 core codecs 类软件包
    libtpl0 unixodbc libtiff5 libldns3 \         
    # mod_python3 类软件包        
    python3-dev python3-pip \      
    # mod_av 类软件包            
    #libavformat56 libswscale5 libavresample4     \ 
    # mod_lua 类软件包     
    liblua5.2-0 lua-cjson lua-socket \ 
    # mod_opus 类软件包                 
    libopus0  \
    # mod_mariadb 类软件包  
    libmariadb3  \
    # mod_pgsql 类软件包 
    libpq5 \
     # mod_sndfile 类软件包                       
    libsndfile1 libflac8 libogg0 libvorbis0a libvorbisenc2  \
    # mod_shout 类软件包 
    libshout3 libmpg123-0 libmp3lame0   \                
    #安装时区包
    tzdata 

    
COPY freeswitch /usr/local/freeswitch
COPY lib /usr/local/lib


COPY freeswitch.py /usr/lib/python3/dist-packages/freeswitch.py



RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple websocket-client

RUN ldconfig




# 设置软链接
RUN ln -sf /usr/local/freeswitch/bin/freeswitch /usr/local/bin/
RUN ln -sf /usr/local/freeswitch/bin/fs_cli /usr/local/bin/

WORKDIR /usr/local/


# 设置时区为北京时间
ENV TZ=Asia/Shanghai

RUN apt-get clean && \
    apt clean && \
    apt-get purge --autoremove && \
    rm -rf /var/lib/apt/lists/*  && \
    rm -rf /usr/local/src/spandsp  /usr/local/src/sofia-sip  /tmp/* /var/tmp/*

2.2.2 将开发环境里面的镜像内容复制到宿主机做准备

bash 复制代码
cd /usr/local/docker/freeswitch_prod
docker cp fs_build:/usr/local/freeswitch ./
docker cp fs_build:/usr/local/lib ./
docker cp fs_build:/usr/lib/python3/dist-packages/freeswitch.py ./

2.2.3 构建镜像

shell 复制代码
cd /usr/local/docker/freeswitch_prod
docker build -t freeswitch_prod:1.10.7 .

2.2.4 生成生产镜像容器

这里看就很小了

创建容器

shell 复制代码
docker run -dit \
  --name fs_prod \
  --net host \
  --restart no \
  --log-driver journald \
   freeswitch_prod:1.10.7 \
  freeswitch  -nonat

进入容器

bash 复制代码
docker exec -it fs_prod fs_cli
相关推荐
fragrans3 分钟前
设置docker镜像加速器
运维·docker·容器
Karoku0661 小时前
【自动化部署】Ansible 基础命令行模块
运维·服务器·数据库·docker·容器·自动化·ansible
~菜鸟笔记~2 小时前
Docker学习笔记
学习·docker
诡异森林。4 小时前
Docker--Docker Container(容器)
docker·容器·eureka
LeonNo1110 小时前
k8s, deployment
java·容器·kubernetes
真上帝的左手15 小时前
十一、容器化 vs 虚拟化-Docker 命令
docker·容器
我的运维人生15 小时前
Docker实践与应用举例:构建高效开发与部署环境
docker·容器·eureka·运维开发·技术共享
小杨童鞋15 小时前
docker中onlyoffice升级指导
运维·docker·云原生·容器·eureka
一掬净土16 小时前
K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常
容器·kubernetes·k8s·diskpressure·磁盘压力