# Getting Started with Docker

Docker Image를 통해 OvenMediaEngine Enterprise를 시작하려면 아래 [설치 방법](#undefined)을 따라 진행하십시오.

## 설치 방법

### 설치  경로

OvenMediaEngine Enterprise는 Docker Container 안의 다음 경로에 설치되어 있습니다.

<table><thead><tr><th>Type</th><th>Path / Description</th><th data-hidden></th></tr></thead><tbody><tr><td>OvenMediaEngine</td><td>/opt/ovenmediaengine/bin</td><td></td></tr><tr><td>Web Console (OvenStudio)</td><td>/opt/ovenmediaengine/ovenstudio</td><td></td></tr><tr><td>Record Delivery</td><td>/opt/ovenmediaengine/delivery</td><td></td></tr><tr><td>Logs</td><td>/var/log/ovenmediaengine</td><td></td></tr></tbody></table>

### 패키지 설치

{% tabs %}
{% tab title="최신 버전" %}
다음 명령어를 통해 최신 버전을 설치 할 수 있습니다.

{% code overflow="wrap" %}

```bash
docker pull ovenmedialabs/ovenmediaengine-enterprise
docker tag ovenmedialabs/ovenmediaengine-enterprise ovenmediaengine-enterprise
```

{% endcode %}
{% endtab %}

{% tab title="최신 GPU 버전" %}
다음 명령어를 통해 최신 GPU 버전을 설치 할 수 있습니다.

{% code overflow="wrap" %}

```bash
docker pull ovenmedialabs/ovenmediaengine-enterprise:latest-gpu
docker tag ovenmedialabs/ovenmediaengine-enterprise:latest-gpu ovenmediaengine-enterprise
```

{% endcode %}
{% endtab %}

{% tab title="특정 버전" %}
특정 버전의 OvenMediaEngine Enterprise를 설치하려면, 먼저 Repository에서 사용 가능한 버전을 확인 하세요.

{% code overflow="wrap" %}

```shellscript
curl -s https://hub.docker.com/v2/repositories/ovenmedialabs/ovenmediaengine-enterprise/tags | grep -oP '"name":\s*"\K[^"]+'

latest
0.20.4.3-1
0.20.4.2-1
0.20.4.1-1
0.20.4.0-1
0.20.3.0-1
```

{% endcode %}

원하는 버전을 선택 한 후 설치하세요.

{% code overflow="wrap" %}

```bash
VERSION=0.20.4.3-1
docker pull ovenmedialabs/ovenmediaengine-enterprise:$VERSION
docker tag ovenmedialabs/ovenmediaengine-enterprise:$VERSION ovenmediaengine-enterprise:$VERSION
```

{% endcode %}
{% endtab %}
{% endtabs %}

## Docker CLI로 실행하기

[설치](#undefined)가 완료 된 후 다음 명령어를 통해 OvenMediaEngine Enterprise를 실행 할 수 있습니다.

<pre class="language-sh" data-overflow="wrap"><code class="lang-sh"><strong>docker run -d --name=ovenmediaengine \
</strong>-e OME_LICENSE_KEY=&#x3C;Your.License.Key> \
-e OME_HOST_IP=&#x3C;Your.HOST.IP.Address> \
-p 1935:1935 -p 8080:8080 -p 9999:9999/udp -p 9000:9000 -p 80:80 -p 3478:3478 -p 10000-10009:10000-10009/udp \
ovenmediaengine-enterprise
</code></pre>

OvenMediaEngine Enterprise 실행 시 다음 두 가지 환경 변수를 설정 해야 합니다.

* `OME_LICENSE_KEY`: 유효하지 않은 License Key를 입력 시 컨테이너는 실행 되지 않습니다.
* `OME_HOST_IP`: 호스트 서버의 IP 설정을 통해 스트리밍 및 Web Console을 원활하게 사용 할 수 있습니다.

### GPU 접근 권한 부여하기

Container 내부에서 GPU 장치를 사용하려고 하는 경우 GPU 버전의 이미지(`ovenmedialabs/ovenmediaengine-enterprise:latest-gpu`)를 설치 한 후, 아래와 같이 `--gpus all` 옵션을 추가하여 OvenMediaEngine Enterprise를 실행해야 합니다. 자세한 설정 방법은 [공식 문서](https://docs.docker.com/engine/containers/gpu/)를 확인해 주세요.

{% code overflow="wrap" %}

```sh
docker run -d --name=ovenmediaengine \
--gpus all \
-e OME_LICENSE_KEY=<Your.License.Key> \
-e OME_HOST_IP=<Your.HOST.IP.Address> \
-p 1935:1935 -p 8080:8080 -p 9999:9999/udp -p 9000:9000 -p 80:80 -p 3478:3478 -p 10000-10009:10000-10009/udp \
ovenmediaengine-enterprise
```

{% endcode %}

### 컨테이너 중지 및 삭제하기

```sh
docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                                                                                                                                                                                                                                                                                                                                 NAMES
2269946c053e   ovenmediaengine-enterprise   "/opt/ovenmediaengin…"   5 minutes ago   Up 5 minutes   0.0.0.0:1935->1935/tcp, [::]:1935->1935/tcp, 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 443/tcp, 0.0.0.0:3478->3478/tcp, [::]:3478->3478/tcp, 5000/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 4000-4005/udp, 8090/tcp, 0.0.0.0:9000->9000/tcp, [::]:9000->9000/tcp, 10010/udp, 0.0.0.0:9999-10009->9999-10009/udp, [::]:9999-10009->9999-10009/udp   ovenmediaengine

docker stop ovenmediaengine
docker rm ovenmediaengine
```

### 설정 및 데이터 유지하기

실행 중인 Container 내의 설정을 변경하거나 기록 중인 Log는 Container가 중지되고 제거 될 때 모든 변경 사항이 삭제됩니다. [Bind mounts](https://docs.docker.com/engine/storage/bind-mounts/)를 사용해 Contaienr 내부의 설정 및 데이터를 영구적으로 유지 할 수 있습니다.

#### Host Directory 생성하기

{% code overflow="wrap" %}

```sh
export OME_DOCKER_HOME=/opt/ovenmediaengine
sudo mkdir -p $OME_DOCKER_HOME/conf
sudo mkdir -p $OME_DOCKER_HOME/logs
sudo mkdir -p $OME_DOCKER_HOME/ovenstudio/data
sudo mkdir -p $OME_DOCKER_HOME/delivery/conf

# 필요한 경우 생성 된 디렉토리에 대한 권한을 설정합니다
sudo chgrp -R docker $OME_DOCKER_HOME
sudo chmod -R 775 $OME_DOCKER_HOME

# OME_DOCKER_HOME을 영구적으로 사용하려면 ~/.profile 파일에 다음 행을 추가하세요
echo -e 'export OME_DOCKER_HOME=/opt/ovenmediaengine' >> ~/.profile
source ~/.profile
```

{% endcode %}

#### Container 기본 설정 파일 복사하기

Docker Container를 [실행](#docker-cli) 한 후 다음 명령어를 통해 OvenMediaEngine Enterprise의 기본 설정을 복사합니다.

{% code overflow="wrap" %}

```sh
# OvenMediaEngine files
docker cp ovenmediaengine:/opt/ovenmediaengine/bin/origin_conf $OME_DOCKER_HOME/

# Web Console(OvenStudio) files
docker cp ovenmediaengine:/opt/ovenmediaengine/ovenstudio/system.env $OME_DOCKER_HOME/ovenstudio/
docker cp ovenmediaengine:/opt/ovenmediaengine/ovenstudio/data $OME_DOCKER_HOME/ovenstudio/

# Delivery files
docker cp ovenmediaengine:/opt/ovenmediaengine/delivery/delivery.db $OME_DOCKER_HOME/delivery/
docker cp ovenmediaengine:/opt/ovenmediaengine/delivery/conf $OME_DOCKER_HOME/delivery/
```

{% endcode %}

### Bind mounts를 사용하여 실행하기

```sh
docker run -d --name=ovenmediaengine \
-e OME_LICENSE_KEY=<Your.License.Key> \
-e OME_HOST_IP=<Your.HOST.IP.Address> \
-v $OME_DOCKER_HOME/origin_conf:/opt/ovenmediaengine/bin/origin_conf \
-v $OME_DOCKER_HOME/logs:/var/log/ovenmediaengine \
-v $OME_DOCKER_HOME/ovenstudio/system.env:/opt/ovenmediaengine/ovenstudio/system.env \
-v $OME_DOCKER_HOME/ovenstudio/data:/opt/ovenmediaengine/ovenstudio/data \
-v $OME_DOCKER_HOME/delivery/delivery.db:/opt/ovenmediaengine/delivery/delivery.db \
-v $OME_DOCKER_HOME/delivery/conf:/opt/ovenmediaengine/delivery/conf \
-p 1935:1935 -p 8080:8080 -p 9999:9999/udp -p 9000:9000 -p 80:80 -p 3478:3478 -p 10000-10009:10000-10009/udp \
ovenmediaengine-enterprise
```

## Docker Compose로 실행하기

Container를 쉽게 정의하고 효율적으로 배포하기 위해 Docker Compose를 활용 할 수 있습니다. Docker Compose의 자세한 사용 방법은 [여기](https://docs.docker.com/compose/)를 참조하세요.

### `docker-compose.yaml` 파일 생성하기

{% code title="docker-compose.yaml" %}

```yaml
services:
  ovenmediaengine:
    image: ovenmediaengine-enterprise
    container_name: ovenmediaengine
    restart: unless-stopped
    environment:
      - OME_LICENSE_KEY=<Your.License.Key>
      - OME_HOST_IP=<Your.HOST.IP.Address>
    ports:
      - 1935:1935
      - 8080:8080
      - 9999:9999/udp
      - 9000:9000
      - 80:80
      - 3478:3478
      - 10000-10009:10000-10009/udp
```

{% endcode %}

[설치](#undefined)가 완료 된 후 다음 명령어를 통해 OvenMediaEngine Enterprise를 실행 할 수 있습니다.

```sh
docker compose up -d

[+] Running 2/2
 ✔ Network root_default       Created              0.1s
 ✔ Container ovenmediaengine  Started              0.8s
```

OvenMediaEngine Enterprise 실행 시 다음 두 가지 환경 변수를 설정 해야 합니다.

* `OME_LICENSE_KEY`: 유효하지 않은 License Key를 입력 시 Conatiner는 실행 되지 않습니다.
* `OME_HOST_IP`: Host Sever의 IP 설정을 통해 Stream 및 Web Console을 원활하게 사용 할 수 있습니다.

### GPU 접근 권한 부여하기

Container 내부에서 GPU 장치를 사용하려고 하는 경우 GPU 버전의 이미지(ovenmedialabs/ovenmediaengine-enterprise:latest-gpu)를 설치 한 후, 아래와 같이 `docker-compose.yaml` 파일 내에 `deploy` 항목을 추가해야 합니다. 자세한 설정 방법은 [공식 문서](https://docs.docker.com/compose/how-tos/gpu-support/)를 확인해 주세요.

{% code title="docker-compose.yaml" %}

```yaml
services:
  ovenmediaengine:
    image: ovenmediaengine-enterprise
    container_name: ovenmediaengine
    restart: unless-stopped
    environment:
      - OME_LICENSE_KEY=<Your.License.Key>
      - OME_HOST_IP=<Your.HOST.IP.Address>
    ports:
      - 1935:1935
      - 8080:8080
      - 9999:9999/udp
      - 9000:9000
      - 80:80
      - 3478:3478
      - 10000-10009:10000-10009/udp
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
```

{% endcode %}

### 컨테이너 중지 및 삭제하기

```sh
docker compose down

[+] Running 2/2
 ✔ Container ovenmediaengine  Removed              1.4s
 ✔ Network root_default       Removed              0.2s
```

### 설정 및 데이터 유지하기

실행 중인 Container 내의 설정을 변경하거나 기록 중인 Log는 Container가 중지되고 제거 될 때 모든 변경 사항이 삭제됩니다. [Bind mounts](https://docs.docker.com/engine/storage/bind-mounts/)를 사용해 Container 내부의 설정 및 데이터를 영구적으로 유지 할 수 있습니다.

#### Host Direcotry 생성하기

{% code overflow="wrap" %}

```sh
export OME_DOCKER_HOME=/opt/ovenmediaengine
sudo mkdir -p $OME_DOCKER_HOME/conf
sudo mkdir -p $OME_DOCKER_HOME/logs
sudo mkdir -p $OME_DOCKER_HOME/ovenstudio/data
sudo mkdir -p $OME_DOCKER_HOME/delivery/conf

# 필요한 경우 생성 된 디렉토리에 대한 권한을 설정합니다
sudo chgrp -R docker $OME_DOCKER_HOME
sudo chmod -R 775 $OME_DOCKER_HOME

# OME_DOCKER_HOME을 영구적으로 사용하려면 ~/.profile 파일에 다음 행을 추가하세요
echo -e 'export OME_DOCKER_HOME=/opt/ovenmediaengine' >> ~/.profile
source ~/.profile
```

{% endcode %}

#### Container 기본 설정 파일 복사하기

Docker Container를 [실행](#docker-compose) 한 후 다음 명령어를 통해 OvenMediaEngine Enterprise의 기본 설정을 복사합니다.

{% code overflow="wrap" %}

```sh
# OvenMediaEngine files
docker cp ovenmediaengine:/opt/ovenmediaengine/bin/origin_conf $OME_DOCKER_HOME/

# Web Console(OvenStudio) files
docker cp ovenmediaengine:/opt/ovenmediaengine/ovenstudio/system.env $OME_DOCKER_HOME/ovenstudio/
docker cp ovenmediaengine:/opt/ovenmediaengine/ovenstudio/data $OME_DOCKER_HOME/ovenstudio/

# Delivery files
docker cp ovenmediaengine:/opt/ovenmediaengine/delivery/delivery.db $OME_DOCKER_HOME/delivery/
docker cp ovenmediaengine:/opt/ovenmediaengine/delivery/conf $OME_DOCKER_HOME/delivery/
```

{% endcode %}

### Bind mounts를 사용하여 Docker Compose 실행하기

{% code title="docker-compose.yaml" %}

```yaml
services:
  ovenmediaengine:
    image: ovenmediaengine-enterprise
    container_name: ovenmediaengine
    restart: unless-stopped
    environment:
      - OME_LICENSE_KEY=<Your.License.Key>
      - OME_HOST_IP=<Your.HOST.IP.Address>
    ports:
      - 1935:1935
      - 8080:8080
      - 9999:9999/udp
      - 9000:9000
      - 80:80
      - 3478:3478
      - 10000-10009:10000-10009/udp
    volumes:
      - $OME_DOCKER_HOME/origin_conf:/opt/ovenmediaengine/bin/origin_conf
      - $OME_DOCKER_HOME/logs:/var/log/ovenmediaengine
      - $OME_DOCKER_HOME/ovenstudio/system.env:/opt/ovenmediaengine/ovenstudio/system.env
      - $OME_DOCKER_HOME/ovenstudio/data:/opt/ovenmediaengine/ovenstudio/data
      - $OME_DOCKER_HOME/delivery/delivery.db:/opt/ovenmediaengine/delivery/delivery.db
      - $OME_DOCKER_HOME/delivery/conf:/opt/ovenmediaengine/delivery/conf
```

{% endcode %}

```sh
docker compose up -d

[+] Running 2/2
 ✔ Network root_default       Created              0.1s
 ✔ Container ovenmediaengine  Started              0.8s
```

## 기본 설정 포트

OvenMediaEngine Enterprise는 기본적으로 아래 나열된 Port를 사용하므로 방화벽 설정이 필요합니다.

### OvenMediaEngine

<table><thead><tr><th width="200">Port</th><th>Purpose</th></tr></thead><tbody><tr><td>1935/TCP</td><td>RTMP Input</td></tr><tr><td>9999/UDP</td><td>SRT Input</td></tr><tr><td>4000/UDP</td><td>MPEG-2 TS Input</td></tr><tr><td>9000/TCP</td><td>Origin Server (OVT)</td></tr><tr><td><p>80/TCP</p><p>443/TLS</p></td><td><p>Low Latency HLS (LLHLS) Streaming</p><p><em><mark style="color:red;">* Streaming over non-TLS is not allowed with modern browsers.</mark></em></p></td></tr><tr><td><p>80/TCP</p><p>443/TLS</p></td><td>WebRTC Signaling (both ingest and streaming)</td></tr><tr><td>3478/TCP</td><td>WebRTC TCP relay (TURN Server, both ingest and streaming)</td></tr><tr><td>10000 - 10009/UDP</td><td>WebRTC Ice candidate (both ingest and streaming)</td></tr><tr><td><p>80/TCP</p><p>443/TLS</p></td><td>Thumbnail Extraction</td></tr></tbody></table>

### Web Console (OvenStudio)

<table><thead><tr><th width="200">Port</th><th>Purpose</th></tr></thead><tbody><tr><td>8080/TCP</td><td>Running Web Console</td></tr></tbody></table>
