Запускаем FreeSWITCH в Docker

В предыдущих статьях я рассказал о том, что такое Docker и как оно все работает. Так же, рассмотрели пример запуска простого Webitel-приложения в контейнере. Сегодня я покажу практический пример, как быстро запустить FreeSWITCH в контейнере.

Для Webitel мы уже давно используем Docker как основной инструмент управления приложением. Для FreeSWITCH я сделал базовый образ, на основание которого строится автоматически образ для Webitel. Недавно, я расширил его еще и под задачи установки vanilla конфигурации FreeSWITCH. Вы можете его использовать для быстрого разворачивания приложения. Как это сделать – опишу ниже.

Docker и FreeSWITCH

Для начала на Вашем Linux должен быть установлен docker. Внутри базового образа FreeSWITCH я установил все необходимые модули, конфигурационный файлы vanilla и, как бонус, mod_bcg729 для поддержки G.729A кодека. В отдельном образе размещены звуковые файлы.

Сначала разворачиваем контейнер для музыки на удержание и русскими звуковыми фразами:

docker run -d -t --name=ru webitel/freeswitch-sound:ru
docker run -d -t --name=moh webitel/freeswitch-sound:moh

Теперь мы можем развернуть контейнер с FreeSWITCH и унаследуем в него звуковые файлы. Так же, у меня подготовленна моя собственная конфигурация, которую я хочу задействовать:

docker run -d -t --privileged=true --net="host" --name=FS --volumes-from=ru,moh -v ${PWD}/fs:/etc/freeswitch webitel/freeswitch-base:vanilla

IP нашей Linux машины с Docker 192.168.99.100 и на него я подключил SIP-клиент. Все, теперь у нас рабочий FreeSWITCH 😉

А теперь самое интересно, подключаем клиента fs_cli:

docker run -i -t --name=cli webitel/freeswitch-base fs_cli -H 192.168.99.100

И еще…

В данном образе я вынес несколько VOLUME, для удобства использования:

  • /certs – SSL сертификаты
  • /db – базы SQLite
  • /recordings – для записей разговоров
  • /scripts – скрипты
  • /etc/freeswitch – и конфигурационный файлы

8 Comments on "Запускаем FreeSWITCH в Docker"


  1. Я близко не знаком с FreeSWITCH, только чтение описательных статей про него. Сейчас пытаюсь сделать свою реализацию Asterisk в Docker. Задачи очень похожи с теми, что пришлось решать и Вам. Замечаю, что моё решение уже сильно начинает отличаться от Вашего. Нет нигде информации как надо делать, это приводит к тому, что каждый делает как сам считает нужным.
    Отсюда несколько вопросов:

    1. Как в прошлый раз Вы и говорили в комментарии – запуск контейнеров с сетевой подсистемой хоста. Я так понимаю, что клиенту отдается какой-то IP, но он предварительно настраивается на хосте алиасом? (Подозреваю, что не так).

    2. В целом по описанию и параметрам запуска вижу, что один хост – один клиент. Это так?

    3. Если предыдущий вопрос имеет положительный ответ, то имеет ли смысл использовать Docker в данном случае?

    4. Конфиги FreeSWITCH имеют какую-то опцию прописанную внутри себя, чтобы знать к какому IP привязываться при запуске?

    5. Зачем использовать привелигированный контейнер? `–priveleged=true`

    6. При запуске контейнера с консолью используется ключ `-H`. Не нашел этого ключа в `docker run`. Этот ключ используется только для демона Docker. Что этот ключ делает в части контейнера?

    Извиняюсь за назойливость, но очень надеюсь получить ответы. Хочется понять что и как делается у вас. Может быть что-то перенять себе, может как-то изменить свою архитектуру, а может вы укажите на какой-то функционал, который был упущен при построении своего решения.

    P.S. Своё решение ещё не готово, сейчас в стадии различных тестов и комбинаций.


  2. Здравствуйте!
    На днях я видел решение asterisk в docker.

    1. FreeSWITCH стартует на том же IP, что и на физическом хосте. Я это делаю для того, что бы не делать проброс всех RTP портов (как в примере с Asterisk).

    2. По факту – да. На одной физической машине у меня живет один FreeSWITCH.

    3. Возможно и не имеет. Но, учитывая тот факт, что мне приходиться часто и много разворачивать FS на разных версиях Linux, удобней “приготовить” свой образ и только из него стартовать.

    4. Конфиги заточены под себя. Но, для Webitel я сделал “зашитый” в образ конфиг, на который можно влиять через переменные среды.

    5. Не помню зачем 🙂 Кажется не мог lame запустить для кодирования звука… или еще что-то …

    6. так `-H` – это параметр fs_cli, а не docker


  3. По поводу решения Asterisk с пробросами групп портов – ужасно. На 4000 правил iptables начнет тормозить. В том примере это получится порядка 2, ну максимум 3 PBX на хост, что при нынешних мощностях – простой железа.
    Для вас такое решение – унификация решения на любую систему. Теперь стало понятно.
    У меня сделано по другому: запускается контейнер без сети, потом с помощью pipework назначается IP. Для этого используются свои скрипты и обвязки, чтобы stateless контейнер сделать на один шаг ближе к statefull.

    Но из-за этого я теряю возможность контролировать сеть каждого контейнера. Вот думаю попробовать использовать какое-либо SDN решение для Docker, но пока не решился.

    Увидел в презентации тут в блоге, что Вы используете Consul. Как это решение по удобству и простоте обслуживания? Есть какие-то мануалы по нему для быстрого старта?


  4. Здравствуйте, ru и moh – сразу стопорятся после запуска не смотря на -d параметр(


  5. использовать для быстрого разочарования приложения. > использовать для быстрого разворачивания приложения.

Leave a Reply

Your email address will not be published. Required fields are marked *