Docker上でjanus-gatewayを構築する

以下の記事を参考に、WSLにDockerをインストールしてjanus-gatewayを構築します。

WSLの設定はこちらを参照

bit数は以下の通り(srtp関連のコンパイルで影響するため明示)

bash-4.2# uname -a
Linux fa82f46217c5 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Dockerをインストール

こちらの記事を参考に進める

(参考) UbuntuにDockerをインストールする手順

https://qiita.com/ryome/items/4b6b934b1b2021acfa26

sudo apt-get update
# 必要なパッケージをインストール
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# keyを登録
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# ダウンロードサイトをaptリポジトリに登録
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# インストール
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# sudoなしでdockerコマンドを利用するため、dockerグループにユーザーを追加する
sudo gpasswd -a ユーザ名 docker

# エラーが発生したので、サービス再起動したところ正常に動作した
sudo service docker stop
sudo service docker start

Dockerの操作メモ

# docker起動
sudo service docker start
# コンテナの一覧
sudo docker ps -a
# コンテナの起動
docker start <CONTAINER ID>
# コンテナにシェルで入る
docker exec -it <CONTAINER ID> bash
# コンテナ停止
docker stop <CONTAINER ID>
# コンテナ削除
docker rm <CONTAINER ID>
# コンテナイメージの削除
docker rmi <CONTAINER ID> 

Amazon Linux 2のコンテナを作成する

最終的にEC2で動作させたいので、Amazon Linux2のイメージを以下の記事を参考につくります。

(参考) Docker上のAmazonLinux2でLaravelの環境構築

https://qiita.com/skyknsk/items/c9710bb952a854a32cfd

# Amazon Linux 2のイメージをpullする
sudo docker pull amazonlinux:2
# コンテナを作成・起動する
docker run -it -d --privileged --name test_amazonlinux -p 8081:80 amazonlinux:2 /bin/bash
# dockerに入る
docker exec -it test_amazonlinux /bin/bash

Janusをインストールする

(参考) WebRTC JanusをDockerコンテナで構築

https://qiita.com/pyuta/items/fb209de51140b6188e29

(参考) janus-gateway 公式

https://github.com/meetecho/janus-gateway

(参考) AmazonLinux2のDockerコンテナにPython3を入れる

https://qiita.com/k_hoso/items/bcd773bbfd260656e621

Amazon Linux2にaptが入っていないので、yumを使う

必要なライブラリのインストール

yum update
yum install -y jansson-devel \
   openssl-devel libsrtp-devel glib2-devel \
   opus-devel libogg-devel libcurl-devel pkgconfig \
   libconfig-devel libtool autoconf automake texi2html texinfo

⇒「sofia-sip-devel」が必要だが現状パッケージがインストールできないかつsipは使わないので、ひとまずスルーする

# libmicrohttpdが古いとjanusのRESTが有効にできないので、cloneしてビルドする((at least v0.9.59)
git clone https://git.gnunet.org/libmicrohttpd.git
mkdir build
cd build
../bootstrap
../configure --prefix=/usr
⇒「HTTPS support:     no (lacking libgnutls)」が気になるが、ひとまず進める
⇒「libgnutls」をyumでinstallできない
https://www.gnutls.org/

make
make install

インストールに必要なパッケージのインストール

yum install -y wget vim git curl make procps-ng

libniceのインストール

# python関係のインストール
yum -y install python3-pip

# python3以上をインストールする
amazon-linux-extras install python3.8 -y
yum install -y python38-devel
pip3.8 install --upgrade pip 
pip install setuptools --upgrade

# ビルド関連をインストール
pip3 install meson
pip3 install ninja

# cmakeが入っていないとwarningが出るのでインストールする
yum install -y gcc gcc-c++
cd /opt/
mkdir janus
cd ./janus/
wget https://github.com/Kitware/CMake/releases/download/v3.23.4/cmake-3.23.4.tar.gz
tar xvf cmake-3.23.4.tar.gz
cd cmake-3.23.4
mkdir build
cd build
../configure --prefix=/path/to/install/cmake/3.23.4
make
make install
PATH="/opt/janus/cmake-3.23.4/build/bin:$PATH"

# 本体をインストール
cd /opt/janus/
git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
meson --prefix=/usr build && ninja -C build && ninja -C build install

gstreamer: NO Neither a subproject directory nor a gstreamer.wrap file was found.
⇒gstreamerが見つからないエラーが出てsubprojectの生成に失敗するが、ひとまずスルー

libsrtpのインストール

cd /opt/janus/
wget https://github.com/cisco/libsrtp/archive/v2.3.0.tar.gz
tar xfv v2.3.0.tar.gz
cd libsrtp-2.3.0
./configure --prefix=/usr --enable-openssl --libdir=/usr/lib64
make shared_library && make install

usrsctpのインストール

cd /opt/janus/
git clone https://github.com/sctplab/usrsctp
cd usrsctp
./bootstrap
./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6 --libdir=/usr/lib64
make && make install

念のためドキュメント生成ツールもインストール

yum install -y doxygen graphviz

Janus本体をインストール

cd /opt/janus/
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway
# configureファイルを生成する
sh autogen.sh

# 動的ライブラリ(libmicrohttpdなど)を参照できるようにする
export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/local/lib/pkgconfig"

./configure --prefix=/opt/janus --enable-rest --disable-plugin-streaming
make
make install
make configs

Janusの動作確認

プロセスを起動し、httpリクエストに応答することを確認

# 共有ライブラリへのpathを設定する
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
# サービス起動
/opt/janus/bin/janus&
# 応答確認
curl http://localhost:8088/janus/info
# janusのプロセスを終了
ps aux | grep janus | grep -v grep | awk '{ print "kill -9", $2 }' | sh

Janusのデモクライアントを設定

# libuvのバージョンがデフォルトだと古くてnodejsのinstallに失敗するため切り替える
yum remove libuv -y 
yum install libuv --disableplugin=priorities

yum install -y nodejs npm

# webサーバーをインストール
npm install -g local-web-server

Janusの起動シェルを設定

cd /opt/janus/janus-gateway
touch run_janus.sh
echo "/opt/janus/bin/janus &" >>run_janus.sh
echo "cd /opt/janus/janus-gateway/html" >>run_janus.sh
echo "ws&" >>run_janus.sh
chmod 755 run_janus.sh

起動シェルを用いて動作確認

./run_janus.sh
curl http://localhost:8000
curl http://localhost:8088/janus/info
exit

コンテナイメージの作成

docker ps -a
docker stop <CONTAINER ID>
docker commit <CONTAINER ID> <コンテナ名>

コンテナイメージからコンテナを作成

# 基本のフォーマット
docker run -itd -p 8088:8088 -p 8000:8000 --name <元にコンテナ名> <作成するコンテナ名>
# 例
docker run -itd -p 8088:8088 -p 8000:8000 --name janus-latest janus-latest /bin/bash -c "/opt/janus/janus-gateway/run_janus.sh;/bin/sh"

ホストから動作確認

# 「c:\Users\<ユーザ名>\.wslconfig」ファイルを作成し、「localhostForwarding=True」とすることで、ホストからWSLのlocalhostにアクセスできる
http://127.0.0.1:8000/videoroomtest.html

Docker HubにPUSH

docker login
# hobにあげるためのイメージ例
docker commit janus-latest murahiro987/janus-on-amzlinux2

Dockerfileを作成する

Dockerfileの内容

ファイル名「Dockerfile」で以下を記述する

# Base Image Amazon Linux2
FROM amazonlinux:2

# OS Update
RUN yum update

# Required library installation
RUN yum install -y jansson-devel \
    openssl-devel libsrtp-devel glib2-devel \
    opus-devel libogg-devel libcurl-devel pkgconfig \
    libconfig-devel libtool autoconf automake texi2html texinfo

# Install the command used for installation
RUN yum install -y wget vim git curl make procps-ng

# libmicrohttpd
RUN cd /opt/ && mkdir janus
RUN cd /opt/janus/ && git clone https://git.gnunet.org/libmicrohttpd.git && \
    cd libmicrohttpd && \
    mkdir build && \
    cd build && \
    ../bootstrap && \
    ../configure --prefix=/usr && \
    make && \
    make install

# libnice

RUN yum -y install python3-pip
RUN amazon-linux-extras install python3.8 -y
RUN yum install -y python38-devel
RUN yes | pip3.8 install --upgrade pip 
RUN yes | pip install setuptools --upgrade
RUN yes | pip3 install meson
RUN yes | pip3 install ninja
RUN yum install -y gcc gcc-c++
RUN cd /opt/janus/ && wget https://github.com/Kitware/CMake/releases/download/v3.23.4/cmake-3.23.4.tar.gz && \
    tar xvf cmake-3.23.4.tar.gz && cd cmake-3.23.4 && mkdir build && cd build && ../configure --prefix=/opt/janus/cmake/3.23.4 && \
    make && make install
RUN PATH="/opt/janus/cmake-3.23.4/build/bin:$PATH"
RUN cd /opt/janus/ && \
    git clone https://gitlab.freedesktop.org/libnice/libnice && \
    cd ./libnice && \
    meson --prefix=/usr build && ninja -C build && ninja -C build install

# libsrtp
RUN cd /opt/janus/ && \
    wget https://github.com/cisco/libsrtp/archive/v2.3.0.tar.gz && \
    tar xfv v2.3.0.tar.gz && \
    cd libsrtp-2.3.0 && \
    ./configure --prefix=/usr --enable-openssl --libdir=/usr/lib64 && \
    make shared_library && make install

# usrsctp
RUN cd /opt/janus/&& \
    git clone https://github.com/sctplab/usrsctp && \
    cd ./usrsctp && \
    ./bootstrap && \
    ./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6 --libdir=/usr/lib64 && \
    make && make install

# document
RUN yum install -y doxygen graphviz

# env
# 動的ライブラリ(libmicrohttpdなど)を参照できるようにする
RUN export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/local/lib/pkgconfig"
# 共有ライブラリへのpathを設定する
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

# Install the Janus server itself
RUN export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/local/lib/pkgconfig" && \
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib && \
    cd /opt/janus/ && \
    git clone https://github.com/meetecho/janus-gateway.git && \
    cd janus-gateway && \
    sh autogen.sh && \
    ./configure --prefix=/opt/janus --enable-rest --disable-plugin-streaming && \
    make && \
    make install && \
    make configs

# Set up Janus Demo client
# node,npm
RUN amazon-linux-extras install -y epel
RUN yum install -y libuv --disableplugin=priorities
RUN yum install -y nodejs npm

# Simple WEB server (local-web-server) installation
RUN npm install -g local-web-server -y

# Set Janus launch shell
RUN cd /opt/janus/janus-gateway/ && \
    touch run_janus.sh && \
    echo "#!/bin/sh" >>run_janus.sh && \
    echo "/opt/janus/bin/janus &" >>run_janus.sh && \
    echo "cd /opt/janus/janus-gateway/html" >>run_janus.sh && \
    echo "ws" >>run_janus.sh && \
    chmod 755 run_janus.sh

EXPOSE 8000 8088

USER root

CMD ["/opt/janus/janus-gateway/run_janus.sh"]

コンテナイメージの作成・実行

「Dockerfile」が存在するディレクトリで以下のコマンドを実行する

# コンテナイメージの作成
docker build -t <image-name> .
# コンテナ実行
docker run -itd -p 8088:8088 -p 8000:8000 --name <コンテナの名称> -d <image-name>

VSCodeからコンテナに接続しファイルを編集する

コマンドパレッド>Attach to Running Container

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です