一、实践过程中的发现的问题

1.用commit命令构建镜像

缺点是反复构建,多次commit提交以后,导致镜像越来越大。

 

2.用dockerfile文件构建镜像

3.容器与宿主机的通信。

使用firewall的端口转发或者docker的端口映射,但是docker的端口映射比较消耗资源。我把10000个UDP端口号映射到宿主机,导致因为内存消耗过高宿主机shutdown问题。

所以可以结合使用,比如信令端口走docker映射,媒体端口走firewall端口转发。

 

二、docker镜像

  在专用的编译服务器上,将FreeSWITCH源码编译。

由于我要做一些模块开发,并且由于项目需求的原因,修改了部分源代码(这不是值得推荐的方式),所以我选择用干净的OS,比如CentOS,再将编译完成的FreeSWITCH打包进去的方法,制作镜像。

以下是我的Dockerfile:

FROM centos
MAINTAINER  Jin Zhuwei

WORKDIR /usr/local/freeswitch
#COPY ./freeswitch  /usr/local/freeswitch/
ADD package.tgz  /usr/local/
RUN yum install -y http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm epel-release && \
yum install -y git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel openssl-devel e2fsprogs-devel sqlite-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel libxml2-devel libyuv-devel opus-devel libvpx-devel libvpx2* libdb4* libidn-devel unbound-devel libuuid-devel lua-devel libsndfile-devel yasm-devel libtiff libtiff-devel bzip2  luarocks \
&& ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin/ \
&& ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin/ \
&& luarocks install luasocket \
&& luarocks install lua-cjson \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "/usr/local/lib/vad-check/lib" >> /etc/ld.so.conf \
&& echo "/usr/local/lib/speech-recognize/lib" >> /etc/ld.so.conf \
&& ldconfig \
&& yum clean all


ENTRYPOINT ["freeswitch"]
 

三、容器部署FreeSWITCH服务

     部署的话,编写yml文件,结合自己写的启动/关闭脚本(start.sh/stop.sh)生成环境变量文件(.env)来实现。

以下是部署用的yml文件的内容:

version: '2.0'
services:
  freeswitch:
    image: ${image}
    container_name: freeswicth_${version}
    network_mode: ${network_mode}
    restart: ${restart_mode}
    privileged: true
    volumes:
      - ${recordings_dir}:/usr/local/freeswitch/recordings
      - ${log_dir}:/usr/local/freeswitch/log
      - ${conf_dir}:/usr/local/freeswitch/conf
      - ${scripts_dir}:/usr/local/freeswitch/scripts
      - ${audio_dir}:${audio_dir}
      - ${tmp_dir}:/tmp
    #command: 
    environment:
      - "VOIP_FREESWITCH_CONF=${pushgateway_conf_dir}"
      - "VOIP_REGISTRY=${pushgateway_host}"
 

使用yml文件好处非常多,对于运维进行服务部署而言,只要加载镜像,执行脚本即可,灵活方便高效。

参数说明:

image: 镜像名字

container_name:容器名字

network_mode:网络模式,我采用host模式,与宿主机共享。

restart:采用restart_always模式。服务如果挂掉,或者服务器宕机,docker进程能迅速重新拉起容器。

privileged:选择true, 允许FreeSWITCH在特权级别运行。

volumes:挂载的目录,这个没啥好说的,把容器内的目录挂载到宿主机。

command:这边的命令参数是可选的,可以选nonat(不进行nat环境自动监测)、nosql(不使用数据库)等,根据需要来。

environment:linux环境变量,此处由于Prometheus分布式监控使用了环境变量,所以我对此进行了配置。

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐