文章目录
- 一、安装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
本次安装是使用阿里云的资源
- 更新您的包管理工具。
bash
sudo yum -y update
- 添加阿里云源到您的实例中,这个源包含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
- 安装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
- 启动Docker并设置Docker守护进程在系统启动时自动启动,这样可以确保每次系统启动时,Docker服务也会自动启动。
说明 如果您的systemctl命令执行异常,请参见在Linux实例中执行systemctl命令报错怎么办?
bash
sudo systemctl start docker
sudo systemctl enable docker
- 通过查看Docker版本命令,验证Docker是否安装成功。
bash
sudo docker -v
如下图回显信息所示,表示Docker已安装成功。
1.3 配置docker镜像源
- 修改镜像源
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"
]
}
- 重新加载
shell
systemctl daemon-reload
- 查看是否生效
出现以下情况,说明生效,特别说明,如果拉不下来镜像,多试几次(如果进行拉不下来,它会轮训切换镜像源
)
二、制作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 生成开发基础镜像容器
- 创建容器
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
命令稍后连接到它。
- 查看是否容器成功
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