docker容器高效部署FreeSWITCH實踐

一、實踐過程中的發現的問題

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分佈式監控使用了環境變量,所以我對此進行了配置。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章