WebRTC JanusをDockerコンテナで構築

## はじめに
WebRTCのJanusのDockerコンテナイメージを構築する手順記録です。
構築したDockerコンテナイメージは[DockerHub](https://hub.docker.com/repository/docker/pyuta/janus-local-run)で公開します。
この手順で作成したDockerコンテナイメージを、すぐに試したい場合は、[Docker Hubの公開イメージからJanusのサービスをコンテナ起動](https://qiita.com/naritam/items/fb209de51140b6188e29#dockerhub%E3%81%AE%E5%85%AC%E9%96%8B%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%89janus%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E8%B5%B7%E5%8B%95)の手順で実施します。


## 前提事項
* ローカル環境で試しにJanusのWebRTCを試すことを目的とした手順です。
* ローカルだけでなくWEBに全体公開や他PC・スマホに外部公開するには、別途、SSL化の対応が必要です。

## 実施環境
MacBook Air (M1, 2020)
Mac OS Big Sur 11.0.1
Docker Desktop シリコンMAC向けPREVIEW版
コンテナのベースイメージ：Debian

## コンテナ初期設定
```shell
#コンテナイメージ取得
$docker pull debian

#コンテナ起動
$docker run -itd debian /bin/sh

#コンテナID確認
$docker ps -a

#コンテナにshellで入る
$docker exec -it コンテナID bash

#アップデート
$apt-get update

#必要ライブラリインストール
$apt install libmicrohttpd-dev libjansson-dev libssl-dev \
 libsofia-sip-ua-dev libglib2.0-dev libopus-dev libogg-dev \
 libcurl4-openssl-dev liblua5.3-dev libconfig-dev \
 pkg-config gengetopt libtool automake gtk-doc-tools doxygen \
 graphviz libnanomsg-dev cmake -y --fix-missing
```

```shell
#インストールに使うコマンドをインストール
$apt-get install -y wget && \
 apt-get install vim -y && \
 apt-get install git -y && \
 apt-get install -y curl
```

## 必要ライブラリインストール
```shell
#libnice
$PATH="/usr/local/bin:$PATH"
$apt install python3-pip
$pip3 install meson
$pip3 install ninja
$cd ~
$git clone https://gitlab.freedesktop.org/libnice/libnice
$cd libnice
$meson --prefix=/usr build && ninja -C build && ninja -C build install

#libsrtp
$cd ~
$wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
$tar xfv v2.2.0.tar.gz
$cd libsrtp-2.2.0
$./configure --prefix=/usr --enable-openssl
$make shared_library && make install

#usrsctp
$cd ~
$git clone https://github.com/sctplab/usrsctp
$cd usrsctp
$./bootstrap
$./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6
$make && make install

#libwebsockets
$cd ~
$git clone https://libwebsockets.org/repo/libwebsockets
$cd libwebsockets
$mkdir build
$cd build
$cmake -DLWS_MAX_SMP=1 -DLWS_WITHOUT_EXTENSIONS=0 \
  -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
$make && make install
```

## Janusサーバ本体をインストール
```shell
$cd ~
$git clone https://github.com/meetecho/janus-gateway.git
$cd janus-gateway
$sh autogen.sh
$./configure --prefix=/opt/janus
$make
$make install
$make configs
```

## Janusサーバ本体の動作確認
```shell
#サービス起動
$/opt/janus/bin/janus&

#curlコマンドでJanusサーバのJson応答があることを確認する
$curl http://localhost:8088/janus/info

#janusプロセスを終了
$ps aux | grep janus | grep -v grep | awk '{ print "kill -9", $2 }' | sh
```

## Janusのデモクライアントを設定
```shell
#node,npmインストール
$apt-get install nodejs npm

#npmのバージョンが古いので、バージョン管理で最新版をインストール
$npm install n -g
$n stable

#古いnodejs npmバージョン削除
$apt purge -y nodejs npm

#シェルを再起動
$exec $SHELL -l

#バージョンを確認
$node -v

#シンプルWEBサーバ（local-web-server）インストール
$npm install -g local-web-server
```

## Janusの起動シェルを設定
```shell
$cd ~/janus-gateway
$touch run_janus.sh
$echo "/opt/janus/bin/janus &" >>run_janus.sh
$echo "cd /root/janus-gateway/html" >>run_janus.sh
$echo "ws&" >>run_janus.sh
$chmod 755 run_janus.sh
```


## Janusの起動シェルを実行し動作確認
```shell
#Janusサーバ、デモ起動
$~/janus-gateway/run_janus.sh

#Janusサーバ、デモの動作確認
$curl http://localhost:8000
$curl http://localhost:8088/janus/info

#コンテナをexitで抜けてホスト側のコンソールに戻る
$exit
```

## コンテナイメージ作成
ホスト側でコンテナイメージを作成します。

```shell
#作業していたコンテナID確認
$docker ps -a

#イメージ作成のためコンテナ停止
$docker stop コンテナID

#コンテナイメージ作成
$docker commit コンテナID janus

#作業していたコンテナを削除
$docker rm コンテナID
```

## 作成したコンテナイメージからコンテナを作成
```shell
$docker run -itd -p 8088:8088 -p 8000:8000 --name janus janus \
  /bin/bash -c "/root/janus-gateway/run_janus.sh;/bin/sh"
```

>ローカル環境のブラウザからJanusのサーバ、クライアントのサービスにアクセスできる様に「-p 8088:8088 -p 8000:8000 」で、ポートフォーワードしてます。
>コンテナ起動時にJanusのサーバ、クライアントを起動する様に「/bin/bash -c」で起動シェルを実行してます。


## ブラウザからJanusデモを動作確認
ブラウザからデモページ(`http://127.0.0.1:8000/videoroomtest.html`)にアクセスし、Janusのビデオルーム等が利用できることを確認する。
右上のSTARTボタンをクリックし、ルーム名を入力すると、ブラウザにパソコンのカメラ映像が表示されます。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/5ed9c8a0-7a89-eb97-69f5-da2ffbc20690.jpeg)
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/e740d95c-d197-f077-29a0-4d3014c58a9e.jpeg)
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/2b2ff179-2f13-cc6f-ae68-da55c2210322.jpeg)

## 作成したDockerイメージをDockerHUBに公開
```shell
#作業していたコンテナID確認
$docker ps -a

#イメージ作成のためコンテナ停止
$docker stop コンテナID

#DockerHubにログイン（ユーザー、パスワードを入力）
$docker login

#Dockerイメージ作成
$docker commit コンテナID pyuta/janus-local-run:latest

#DockerイメージのイメージID確認
$docker images

#DockerHubにPush
$docker push pyuta/janus-local-run:latest
```

#DockerHUBの公開イメージからJanusのサービスをコンテナ起動
```shell
$docker run -itd -p 8088:8088 -p 8000:8000 --name janus \
  pyuta/janus-local-run:latest \
  /bin/bash -c "/root/janus-gateway/run_janus.sh;/bin/sh"
```
ブラウザからデモページ(`http://127.0.0.1:8000/videoroomtest.html`)にアクセスし、Janusのビデオルーム等が利用できることを確認する。
右上のSTARTボタンをクリックし、ルーム名を入力すると、ブラウザにパソコンのカメラ映像が表示されます。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/5ed9c8a0-7a89-eb97-69f5-da2ffbc20690.jpeg)

##今後の対応
ローカルのDocker環境でJanusのサービスをコンテナ化できたので、次の目標は直接、外部公開で利用できるコンテナイメージを作りたいと考えてます。

>**追記**
記載の手順をDockerfile化しました。[Web RTC JanusコンテナをDockerfileで作成 \- Qiita](https://qiita.com/pyuta/items/644bb0536daacc40cffe)で公開します。