Конфигурация контейнера Docker
В этой статье описывается процесс настройки контейнера Docker. Docker позволяет разрабатывать или запускать приложение на основе UNIGINE в различных средах изолированно внутри контейнера. Для выполнения всех необходимых действий на вашем компьютере должна быть установлена графическая карта NVIDIA и система Linux с поддержкой Ubuntu.
Для работы с другими дистрибутивами, такими как Amazon, Open Suse, Debian, Centos или RHEL, пожалуйста, ознакомьтесь с документацией NVIDIA Container Toolkit.
Системные требования#
Вам необходимо выключить все программы, воспроизводящие звук. Для корректного воспроизведения звука в системе должен быть установлен драйвер ALSA.
Демон Docker привязывается к сокету Unix, а не к TCP-порту. По умолчанию сокетом Unix владеет пользователь root, а другие пользователи могут получить к нему доступ только с помощью sudo (читать подробнее). Демон Docker всегда запускается от имени пользователя root.
Если вы не хотите писать sudo перед командой docker, создайте группу Unix с именем docker и добавьте в нее пользователей (читать подробнее). Когда запускается демон Docker, он создает сокет Unix, доступный членам группы docker.
Настройка Docker#
Чтобы настроить Docker, выполните следующие действия:
- Установите NVIDIA Container Toolkit
- Получите образ контейнера Docker или соберите его самостоятельно.
- Запустите контейнер Docker в тестовом режиме.
Установка NVIDIA Container Toolkit#
-
Настройте NVIDIA Container Toolkit в соответствии с руководством по настройке. Установите репозиторий пакетов и ключ GPG, введите для этого в командной строке:
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
-
Установите nvidia-docker2:
$ sudo apt-get update $ sudo apt-get install -y nvidia-docker2
-
Перезапустите Docker:
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
Подготовка образа контейнера#
На Docker Hub есть готовый к использованию образ контейнера, который мы подготовили для вас — перейдите по ссылке run-unigine-in-docker и используйте следующую команду:
docker pull unigine/run-unigine-in-docker
В случае, если по какой-либо причине вместо использования образа контейнера из Docker Hub вы захотите подготовить и собрать свой образ контейнера вручную, пожалуйста, следуйте инструкциям в спойлере ниже:
-
Создайте папку для работы с контейнером:
$ mkdir ~/unigine-in-docker
-
Создайте текстовый файл Dockerfile в папке unigine-in-docker/:
$ cd ~/unigine-in-docker $ touch Dockerfile
-
Добавьте следующие строки в файл Dockerfile и сохраните его:
FROM nvidia/opengl:base-ubuntu20.04 VOLUME /tmp/.X11-unix RUN apt update && apt upgrade -y # linux-headers- hardcoded, if it don't build - try update version of linux-headers RUN DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt install -y \ python3 \ wget gnupg \ xvfb \ x11-xserver-utils \ python3-pip \ libegl1-mesa \ libgl1-mesa-dev \ libxv1 \ gcc g++ make ccache \ libxrandr-dev \ libxinerama-dev \ libopenal1 \ libxrender-dev \ libxext-dev \ libc6-dev \ libx11-dev \ libxi-dev \ libxml2-dev \ cmake \ nano vim \ lshw \ libglu1-mesa \ mesa-utils \ glmark2 \ xxd \ # for sdk bro2 \ libxcb-shape0 \ libxcb-xkb1 \ libxcb-icccm4 \ libxcb-image0 \ libxcb-keysyms1 \ libxcb-render-util0 \ libxkbcommon-x11-0 \ linux-headers-5.4.0-135-generic \ lxterminal \ # sound \ alsa-base \ alsa-utils \ libsndfile1-dev COPY ./asound.conf /etc/ RUN python3 -m pip install pyinotify ENV XDG_RUNTIME_DIR=/tmp/.X11-unix # install dotnet and runtime # if it don't build - try to find more recent versions of dotnet at https://dotnet.microsoft.com/en-us/download/dotnet/6.0 RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/01292c7c-a1ec-4957-90fc-3f6a2a1e5edc/025e84c4d9bd4aeb003d4f07b42e9159/dotnet-sdk-6.0.418-linux-x64.tar.gz RUN wget -O dotnet-runtime.tar.gz https://download.visualstudio.microsoft.com/download/pr/b63daa46-51f4-480e-ad03-ef2c5a6a2885/ae059763456991305109bf98b3a67640/aspnetcore-runtime-6.0.26-linux-x64.tar.gz RUN mkdir /usr/local/etc/dotnet-sdk-6.0 RUN tar -xzf dotnet.tar.gz -C /usr/local/etc/dotnet-sdk-6.0 RUN tar -xzf dotnet-runtime.tar.gz -C /usr/local/etc/dotnet-sdk-6.0 RUN rm -rf /usr/bin/dotnet RUN ln -s /usr/local/etc/dotnet-sdk-6.0/dotnet /usr/bin/dotnet # path to libraries ENV LD_LIBRARY_PATH="/opt/project/bin"
-
Создайте новый файл asound.conf:
$ sudo vi asound.conf
-
Запишите следующий скрипт в файл asound.conf:
pcm.!default { type plug slave { pcm "hw:0,0" } } ctl.!default { type hw card 0 } pcm.mixed-analog { type plug slave.pcm "dmix-analog" hint { show on description "Mixed Analog Output - Use analog outputs, converting samples, format, and rate as necessary. Allows mixing with system sounds." } } # Control device (mixer, etc.) for the card ctl.mixed-analog { type hw card 0 }
-
Соберите образ Docker (внутри папки unigine-in-docker):
$ docker build --rm --tag run_unigine_in_docker:latest -f Dockerfile .
Тестовый запуск Docker#
-
Запустите контейнер в пробном режиме, чтобы просмотреть характеристики графического процессора:
$ cd ~/unigine-in-docker/ $ docker run -it --rm --network host \ --runtime=nvidia --gpus 0 -e NVIDIA_VISIBLE_DEVICES=0 \ -e DISPLAY=${DISPLAY} \ -e NVIDIA_DRIVER_CAPABILITIES=display,compute \ -v /tmp/.X11-unix:/tmp/.X11-unix \ run_unigine_in_docker:latest \ /bin/bash # nvidia-smi
-
Проверьте выбранные драйверы графического процессора с помощью следующей команды: glxinfo | grep "OpenGL". Вы увидите полную информацию о графическом процессоре. Или используйте команду glxinfo | grep "OpenGL renderer" для отображения названия модели используемого графического процессора. Пример вывода:
Использование контейнера Docker#
После создания и запуска контейнера Docker с графическим ускорением, вы можете выполнить следующие действия: