docker容器高效部署FreeSWITCH实践
1.用commit命令构建镜像缺点是反复构建,多次commit提交以后,导致镜像越来越大。2.用dockerfile文件构建镜像3.容器与宿主机的通信。使用firewall的端口转发或者docker的端口映射,但是docker的端口映射比较消耗资源。我把10000个UDP端口号映射到宿主机,导致因为内存消耗过高宿主机shutdown问题。所以可以结合使用,比如信令端...
一、实践过程中的发现的问题
1.用commit命令构建镜像
缺点是反复构建,多次commit提交以后,导致镜像越来越大。
2.用dockerfile文件构建镜像
3.容器与宿主机的通信。
使用firewall的端口转发或者docker的端口映射,但是docker的端口映射比较消耗资源。我把10000个UDP端口号映射到宿主机,导致因为内存消耗过高宿主机shutdown问题。
所以可以结合使用,比如信令端口走docker映射,媒体端口走firewall端口转发。
二、docker镜像
在专用的编译服务器上,将FreeSWITCH源码编译。
由于我要做一些模块开发,并且由于项目需求的原因,修改了部分源代码(这不是值得推荐的方式),所以我选择用干净的OS,比如CentOS,再将编译完成的FreeSWITCH打包进去的方法,制作镜像。
以下是我的Dockerfile:
FROM centos
MAINTAINER Jin ZhuweiWORKDIR /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分布式监控使用了环境变量,所以我对此进行了配置。
更多推荐
所有评论(0)