логотип PurpleSchool
логотип PurpleSchool

Графический интерфейс в Docker- как использовать GUI приложения внутри контейнеров

Автор

Олег Марков

Введение

Docker изначально создавался для запуска серверных приложений и сервисов в изолированной среде. Однако, это не означает, что вы не можете работать с графическими интерфейсами внутри контейнеров. Сегодня я расскажу вам о том, как запустить GUI приложения внутри Docker. Мы разберем основные методики и примеры настройки, чтобы вы могли успешно использовать Docker для задач, требующих работы с графическим интерфейсом.

Настройка окружения

Прежде всего, для работы с GUI приложениями в Docker нужно настроить окружение, которое позволит приложениям из контейнера отображать интерфейс на вашей локальной машине. Для этого существует несколько подходов, таких как использование X11 и VNC.

Использование X11

Простейший способ — это использовать X11-сервер на вашей локальной машине. X11 – это система отображения графической информации на Unix-системах. Она позволяет выполнять приложения на удаленных серверах, а отображать их на вашем рабочем столе.

Настройка Docker контейнера

Для начала, вам нужно предоставить Docker контейнеру доступ к X11-серверу. Обратите внимание на следующую Docker команду:

docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix img_with_gui_app
  • -e DISPLAY=$DISPLAY: Эта опция задает переменную окружения DISPLAY, которая указывает, где должно быть отображено окно приложения. Обычно это ваш локальный дисплей.

  • -v /tmp/.X11-unix:/tmp/.X11-unix: Эта опция создает volume, который подключает сокет X11 от вашей локальной системы к контейнеру.

Настройка разрешений

Прежде чем запускать контейнер, нужно разрешить Docker доступ к вашему X серверу:

xhost +local:docker

Теперь приложение из Docker контейнера сможет отображаться на вашем дисплее.

Использование VNC

Если вы хотите работать с GUI приложениями удаленно, или не можете использовать X11, то поможет VNC. Virtual Network Computing (VNC) – это система для удаленного доступа к графическому интерфейсу.

Создание образа с VNC-сервером

Для этого вам нужно создать Docker образ, который будет включать VNC-сервер. Ниже представлен Dockerfile, который вы можете использовать:

FROM ubuntu:latest

# Установка необходимых пакетов
RUN apt-get update && apt-get install -y \
    x11vnc \
    xvfb \
    xfce4 \
    && rm -rf /var/lib/apt/lists/*

# Создать VNC пароль
RUN x11vnc -storepasswd 1234 /etc/vnc.pass

CMD ["x11vnc", "-display", ":0", "-rfbport", "5900", "-usepw", "-forever"]

В этом Dockerfile мы устанавливаем x11vnc и xvfb для настройки виртуального дисплея и VNC-сервера.

Запуск контейнера

После создания образа, запустите контейнер следующим образом:

docker build -t my_vnc_image .
docker run -p 5900:5900 my_vnc_image

Теперь вы можете подключиться к вашему контейнеру с помощью VNC-клиента на порте 5900.

Запуск приложений

Вы установили все необходимое для отображения графического интерфейса. Теперь давайте запустим ваше первое GUI приложение внутри контейнера.

Пример с Firefox

Для примера, давайте запустим браузер Firefox внутри Docker контейнера:

FROM ubuntu:latest

RUN apt-get update && apt-get install -y \
    firefox \
    && rm -rf /var/lib/apt/lists/*

CMD ["firefox"]

Теперь вы можете создать и запустить контейнер с Firefox:

docker build -t firefox_image .
docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix firefox_image

После выполнения этой команды вы увидите, как Firefox запускается и отображается на вашем рабочем столе.

Заключение

Работа с графическим интерфейсом в Docker открывает новые возможности для использования контейнеров не только на серверной стороне, но и для задач, требующих визуализации и взаимодействия с пользователем. Вы можете использовать X11 или VNC для организации графического интерфейса, запуская стандартные настольные приложения в контейнерах. Это полезно для тестирования, изоляции ваших разработок, а также для создания реплицируемых и независимых от платформы сред.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile