В предыдущих статьях я рассказал о том, что такое 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
— и конфигурационный файлы
Я близко не знаком с FreeSWITCH, только чтение описательных статей про него. Сейчас пытаюсь сделать свою реализацию Asterisk в Docker. Задачи очень похожи с теми, что пришлось решать и Вам. Замечаю, что моё решение уже сильно начинает отличаться от Вашего. Нет нигде информации как надо делать, это приводит к тому, что каждый делает как сам считает нужным.
Отсюда несколько вопросов:
1. Как в прошлый раз Вы и говорили в комментарии — запуск контейнеров с сетевой подсистемой хоста. Я так понимаю, что клиенту отдается какой-то IP, но он предварительно настраивается на хосте алиасом? (Подозреваю, что не так).
2. В целом по описанию и параметрам запуска вижу, что один хост — один клиент. Это так?
3. Если предыдущий вопрос имеет положительный ответ, то имеет ли смысл использовать Docker в данном случае?
4. Конфиги FreeSWITCH имеют какую-то опцию прописанную внутри себя, чтобы знать к какому IP привязываться при запуске?
5. Зачем использовать привелигированный контейнер? `—priveleged=true`
6. При запуске контейнера с консолью используется ключ `-H`. Не нашел этого ключа в `docker run`. Этот ключ используется только для демона Docker. Что этот ключ делает в части контейнера?
Извиняюсь за назойливость, но очень надеюсь получить ответы. Хочется понять что и как делается у вас. Может быть что-то перенять себе, может как-то изменить свою архитектуру, а может вы укажите на какой-то функционал, который был упущен при построении своего решения.
P.S. Своё решение ещё не готово, сейчас в стадии различных тестов и комбинаций.
Здравствуйте!
На днях я видел решение asterisk в docker.
1. FreeSWITCH стартует на том же IP, что и на физическом хосте. Я это делаю для того, что бы не делать проброс всех RTP портов (как в примере с Asterisk).
2. По факту — да. На одной физической машине у меня живет один FreeSWITCH.
3. Возможно и не имеет. Но, учитывая тот факт, что мне приходиться часто и много разворачивать FS на разных версиях Linux, удобней «приготовить» свой образ и только из него стартовать.
4. Конфиги заточены под себя. Но, для Webitel я сделал «зашитый» в образ конфиг, на который можно влиять через переменные среды.
5. Не помню зачем 🙂 Кажется не мог lame запустить для кодирования звука… или еще что-то …
6. так `-H` — это параметр fs_cli, а не docker
По поводу решения Asterisk с пробросами групп портов — ужасно. На 4000 правил iptables начнет тормозить. В том примере это получится порядка 2, ну максимум 3 PBX на хост, что при нынешних мощностях — простой железа.
Для вас такое решение — унификация решения на любую систему. Теперь стало понятно.
У меня сделано по другому: запускается контейнер без сети, потом с помощью pipework назначается IP. Для этого используются свои скрипты и обвязки, чтобы stateless контейнер сделать на один шаг ближе к statefull.
Но из-за этого я теряю возможность контролировать сеть каждого контейнера. Вот думаю попробовать использовать какое-либо SDN решение для Docker, но пока не решился.
Увидел в презентации тут в блоге, что Вы используете Consul. Как это решение по удобству и простоте обслуживания? Есть какие-то мануалы по нему для быстрого старта?
Consul пока в режиме тестирования. В продакшине еще не используем.
Здравствуйте, ru и moh — сразу стопорятся после запуска не смотря на -d параметр(
Так и должно быть — это контейнеры с файлами
использовать для быстрого разочарования приложения. > использовать для быстрого разворачивания приложения.
точно )
# 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!]
# 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
запускал докер контейнер вот так не стартует. Ошибка в предыдущем посте.
Спасибо
А у вас папка с конфигами ${PWD}/fs именно здесь ?
По ошибке — не находит конфиг