WCS в Docker¶
Начиная со сборки 5.2.458, WCS доступен в виде официального Docker образа
Пример развертывания в Docker¶
Развернем WCS в Docker за несколько шагов:
1. Загрузите актуальную сборку с Docker Hub
2. Настройте docker сеть
sudo docker network create \
--subnet 192.168.1.1/24 \
--gateway=192.168.1.1 \
--driver=bridge \
--opt com.docker.network.bridge.name=br-testnet testnet
3. Запустите docker контейнер, указав номер ознакомительной или коммерческой лицензии
docker run \
-e PASSWORD=password \
-e LICENSE=license_number \
-e LOCAL_IP=192.168.1.10 \
--net testnet --ip 192.168.1.10 \
--name wcs-docker-test --rm -d flashphoner/webcallserver:latest
4. Проверьте доступность контейнера по SSH
5. Откройте страницу примера Two Way Streaming в локальном браузере и опубликуйте поток
6. Закройте страницу, остановите контейнер
При остановке контейнера лицензия будет деактивирована, чтобы избежать излишнего биллинга.
Настройка docker контейнера¶
Настройка сети¶
По умолчанию, IP адрес назначается контейнеру динамически. Если планируется использовать статический IP адрес, нужно указать его в параметрах команды docker run
и передать в контейнер при помощи переменной LOCAL_IP
:
docker run -e LICENSE=license_number -e PASSWORD=secret \
-e LOCAL_IP=static_ip \
--net your-docker-network \
--ip static_ip \
--name webcallserver-instance -d webcallserver:latest
Если docker узел находится в локально сети за NAT, и сервер должен быть доступен снаружи, необходимо указать внешний IP адрес в переменной EXTERNAL_IP
:
docker run -e LICENSE=license_number -e PASSWORD=secret \
-e LOCAL_IP=static_ip \
-e EXTERNAL_IP=external_ip \
--net your-docker-network \
--ip static_ip \
--name webcallserver-instance -d webcallserver:latest
Особенности динамического определения IP адреса¶
Если IP адрес назначается контейнеру динамически, и при этом контейнер имеет несколько сетевых интерфейсов (такое может быть, например, в случае использования интерфейсов docker хоста), на этапе запуска контейнера необходимо вручную выбрать IP адрес, к которому привяжется WCS сервер. В этом случае контейнер должен быть запущен в интерактивном режиме
docker run \
-e PASSWORD=password \
-e LICENSE=license_number \
--net host \
--name wcs-docker-test --rm -it flashphoner/webcallserver:latest
Скрипт запуска контейнера определит IP адреса всех интерфейсов и предложит ввести тот, который будет прослушивать WCS сервер
В параметр ip_local
будет записан выбранный IP адрес, например
Настройка параметров контейнера
При запуске в контейнер можно передавать следующие параметры:
PASSWORD
- пароль на доступ внутрь контейнера по SSH. Если эта переменная не определена, контейнер не будет доступен по паролюLICENSE
- номер лицензии WCS. Если эта переменная не определена, лицензия может быть активирована через веб-интерфейсLOCAL_IP
- локальный IP адрес контейнера, который будет записан в параметрip_local
в файле настроекflashphoner.properties
. Если эта переменная не определена, IP адрес контейнера будет определен автоматическиEXTERNAL_IP
- локальный IP адрес контейнера, который будет записан в параметрip
в файле настроекflashphoner.properties
. Если эта переменная не определена иLOCAL_IP
не определена, внешний IP адрес контейнера будет определен автоматическиCDN_ROLE
- роль контейнера в CDN. Если эта переменная не определена, контейнер будет работать как отдельно стоящий серверCDN_ENTRY_POINT
- адрес сервера-точки входа в CDN для данного контейнера. Если эта переменная не определена, точка входа не задаетсяCDN_GROUPS
- группы CDN, в которые должен входитьконтейнер. Если эта переменная не определена, контейнер не принадлежит ни к одной группе
Настройка docker томов¶
При запуске в контейнер могут быть смонтированы следующие тома:
/conf
- каталог дополнительных файлов конфигурации, путь отсчитывается от корня контейнера. Этот каталог может быть смонтирован только для чтения/usr/local/FlashphonerWebCallServer/hls
- каталог для сегментов HLS. Этот каталог должен быть смонтирован для записи/usr/local/FlashphonerWebCallServer/logs
- каталог для логирования. Этот каталог должен быть смонтирован для записи/usr/local/FlashphonerWebCallServer/media
- каталог с файлами для воспроизведения VOD. Этот каталог может быть смонтирован только для чтения. Этот каталог может быть быть общим с другими экземплярами WCS/usr/local/FlashphonerWebCallServer/records
- каталог для файлов записей потоков. Этот каталог должен быть смонтирован для записи. Этот каталог может быть быть общим с другими экземплярами WCS
Пример запуска контейнера со всеми смонтированными томами:
docker run -e LICENSE=license_number -e CDN_ROLE=origin \
-v /opt/wcs/conf:/conf \
-v /opt/wcs/logs:/usr/local/FlashphonerWebCallServer/logs \
-v /opt/wcs/hls:/usr/local/FlashphonerWebCallServer/hls \
-v /opt/wcs/media:/usr/local/FlashphonerWebCallServer/media \
-v /opt/wcs/records:/usr/local/FlashphonerWebCallServer/records \
--name webcallserver-instance -d webcallserver:latest
Не допускается монтирование всего каталога /usr/local/FlashphonerWebCallServer/conf
как тома, или отдельных файлов из этого каталога!
Например, так делать нельзя:
docker run -e LICENSE=license_number -e PASSWORD=secret \
-v /opt/wcs/conf:/usr/local/FlashphonerWebCallServer/conf \
--name webcallserver-instance -d webcallserver:latest
и так тоже:
docker run -e LICENSE=license_number -e PASSWORD=secret \
-v /opt/wcs/conf/flashphoner.properties:/usr/local/FlashphonerWebCallServer/conf/flashphoner.properties \
--name webcallserver-instance -d webcallserver:latest
Дополнительная настройка¶
В каталог, смонтированный как том /conf
, могут быть помещены следующие файлы настроек
id_rsa.pub
- публичный SSH ключ для доступа к контейнеру. Если этот файл найден при запуске контейнера, будет работать SSH доступ в контейнер по соответствующему приватному ключу. В противном случае, если переменнаяPASSWORD
определена, контейнер будет доступен по заданному паролю. Если не определены ни публичный ключ, ни пароль, SSH сервис не будет запущенflashphoner.properties
- основной файл настроек сервера. Может быть использован для настройки экземпляра WCSwcs-core.properties
- файл настроек Java. Может использоваться для настройки памяти и подключения из JMClog4j.properties
- файл настроек логированияwss.jks
- файл хранилища ключей SSL сертификатов. Файл может быть подготовлен при помощи keytoolcdn_profiles.yml
- файл настройки профилей транскодирования в CDNdatabase.yml
- файл настройки пользователей и обработчиков REST хуков*.sdp
- файлы настроек SDP
Все эти файлы могут быть использованы, например, для восстановления настроек экземпляра WCS из сохраненной копии и для автоматического развертывания. Файлы копируются в контейнер 'как есть', за исключением flashphoner.properties
:
- параметры
ip
иip_local
будут изменены (см описание переменнойIP_LOCAL
) - если переменная
CDN_ROLE
определена, но файл не содержит никаких настроек CDN, будут добавлены настройки по умолчанию
Порты контейнера¶
По умолчанию доступны следующие порты:
22/tcp
- SSH (этот порт активен, если настроен )554/tcp
- RTSP порт1935/tcp
- RTMP порт1935/udp
- RTMFP порт2001/tcp
- CLI порт7777/tcp
- порт мониторинга сервера8080-8084/tcp
- WS, HTTP, CDN порты8443-8445/tcp
- WSS, HTTPS порты8888/tcp
- HTTPS порт (для совместимости со старыми версиями)9091/tcp
- HTTP порт (для совместимости со старыми версиями)30000-35000/tcp
- TCP медиа порты30000-35000/udp
- UDP медиа порты50999/tcp
- JMX порт
Состав портов при необходимости может быть изменен при помощи параметров запуска docker run --expose
. В этом случае значения портов должны быть указаны в файлах
настроек flashphoner.properties
и wcs-core.properties
, см выше
Сборка собственного Docker образа на базе образа WCS¶
Иногда возможностей официального Docker образа из коробки недостаточно, и нужно собрать собственный образ для тестирования или эксплуатации. Например, соберем собственный Docker образ на базе WCS с дополнительными возможностями:
- собственный скрипт
on_record_hook.sh
- том для непосредственного монтирования каталога с конфигурацией WCS
1. Подготовим Dockerfile
FROM flashphoner/webcallserver:latest
VOLUME /usr/local/FlashphonerWebCallServer/conf
COPY on_record_hook.sh /usr/local/FlashphonerWebCallServer/bin/on_record_hook.sh
RUN chmod +x /usr/local/FlashphonerWebCallServer/bin/on_record_hook.sh
2. Подготовим пример скрипта on_record_hook.sh
и поместим его рядом с Dockerfile
# This script logs a stream name and a recording file name to records.log file
STREAM_NAME=$1
FILE_NAME=$2
echo "Hello, I'm recording from docker" >> /usr/local/FlashphonerWebCallServer/logs/records.log
echo $STREAM_NAME >> /usr/local/FlashphonerWebCallServer/logs/records.log
echo $FILE_NAME >> /usr/local/FlashphonerWebCallServer/logs/records.log
3. Соберем Docker образ с именем wcs-custom-image
4. Готово! Можно запустить контейнер из созданного образа, например
sudo docker network create \
--subnet 192.168.1.1/24 \
--gateway=192.168.1.1 \
--driver=bridge \
--opt com.docker.network.bridge.name=br-testnet testnet
sudo chmod -R og+w /opt/wcs/logs /opt/wcs/records /opt/wcs/conf
docker run \
-e PASSWORD=password \
-e LICENSE=license_number \
-e LOCAL_IP=192.168.1.10 \
-v /opt/wcs/logs:/usr/local/FlashphonerWebCallServer/logs \
-v /opt/wcs/records:/usr/local/FlashphonerWebCallServer/records \
-v /opt/wcs/conf:/usr/local/FlashphonerWebCallServer/conf
--net testnet --ip 192.168.1.10 \
--name wcs-docker-test --rm -d wcs-custom-image:latest
Известные проблемы¶
1. При запуске контейнера нельзя изменить ограничение на количество открытых файлов изнутри контейнера¶
Симптомы
При запуске контейнера в интерактивном режиме выводится сообщение
Решение
Установить ограничение на количество открытых файлов в параметрах запуска контейнера
2. Не рекомендуется использовать Docker на Windows из-за проблем с пробросом портов¶
Симптомы
При развертывании образа в Docker под Windows контейнер запущен, но недоступен по SSH, по HTTP/HTTPS, не устанавливается WebRTC соединение
Решение
Использовать Docker на Linux, либо запускать WCS в WSL 2