Запускаем 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 — и конфигурационный файлы

11 комментариев 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. использовать для быстрого разочарования приложения. > использовать для быстрого разворачивания приложения.


  6. # docker logs a8f4a6084a10
    ERROR: Failed to set SCHED_FIFO scheduler (Operation not permitted)
    ERROR: Could not set nice level
    2018-01-02 12:07:00.085922 [INFO] switch_event.c:685 Activate Eventing Engine.
    2018-01-02 12:07:00.098736 [WARNING] switch_event.c:656 Create additional event dispatch thread 0
    2018-01-02 12:07:00.099315 [ERR] switch_xml.c:1354 Couldn’t open /etc/freeswitch/freeswitch.xml (No such file or directory)
    Cannot Initialize [Cannot Open log directory or XML Root!]


  7. # docker run -d -t —privileged=true —net=»host» —name=FS —volumes-from=ru —volumes-from=moh -v ${PWD}/fs:/etc/freeswitch webitel/freeswitch-base:vanilla
    запускал докер контейнер вот так не стартует. Ошибка в предыдущем посте.
    Спасибо

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.