Поиск по сайту:

Как запускать приложения с графическим интерфейсом в контейнере Docker


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

Во-первых, важно понять, что на самом деле делает Docker. «Контейнер» Docker — это форма инкапсуляции, внешне похожая на виртуальную машину. В отличие от виртуальной машины, контейнеры используют то же ядро Linux, что и их хост-система.

Следующим компонентом является система X Window. X-серверы, такие как Xorg, обеспечивают основные графические возможности систем Unix. Приложения с графическим интерфейсом не могут отображаться без доступного X-сервера. (Доступны альтернативные оконные системы, такие как Wayland — в этой статье мы сосредоточимся на X.)

Попытка запустить X-сервер в Docker теоретически возможна, но редко используется. Вам нужно будет запустить Docker в привилегированном режиме (--privived), чтобы он мог получить доступ к оборудованию вашего хоста. Запуск сервера будет пытаться заявить права на ваши видеоустройства, что обычно приводит к потере вывода видео, поскольку исходный X-сервер вашего хоста отключает свои устройства.

Лучший подход — смонтировать сокет X-сервера вашего хоста в контейнер Docker. Это позволяет вашему контейнеру использовать X-сервер, который у вас уже есть. Приложения с графическим интерфейсом, работающие в контейнере, затем появятся на вашем существующем рабочем столе.

Зачем запускать приложения с графическим интерфейсом в Docker?

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

Этот подход также помогает избежать любых несовместимостей с другими пакетами в вашей среде. Если вам нужно временно запустить две версии программы, вы можете использовать Docker, чтобы избежать удаления и переустановки программного обеспечения на вашем хосте.

Перенаправление сокета X в контейнер Docker

Предоставление контейнеру Docker доступа к X-сокету вашего хоста — простая процедура. Сокет X можно найти в /tmp/.X11-unix на вашем хосте. Содержимое этого каталога должно быть смонтировано в том Docker, назначенный контейнеру. Для этого вам потребуется использовать сетевой режим host.

Вы также должны предоставить контейнеру переменную среды DISPLAY. Это указывает X-клиентам — вашим графическим программам — к какому X-серверу подключаться. Задайте для DISPLAY в контейнере значение $DISPLAY на вашем хосте.

Вы можете инкапсулировать всю эту конфигурацию в один файл docker-compose.yml:

version: "3"

services:
  app:
    image: my-app:latest
    build: .
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
    network_mode: host

Затем вам нужно создать Dockerfile для вашего приложения. Вот пример, который запускает веб-браузер Firefox:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox
CMD ["/usr/bin/firefox"]

Теперь соберите и запустите образ:

docker-compose build
docker-compose up

На рабочем столе должно появиться новое окно Firefox! Экземпляр Firefox будет работать внутри контейнера независимо от любых других открытых окон Firefox. Контейнер будет использовать сокет X вашего хоста, поэтому контейнерный Firefox по-прежнему отображается на вашем рабочем столе.

Этот подход следует использовать только в том случае, если вы доверяете своему контейнеру Docker. Открытие сервера отображения хоста представляет собой угрозу безопасности, если вы не совсем уверены, что находится внутри контейнера.

Обработка X-аутентификации

Вам может потребоваться аутентифицировать контейнер для доступа к X-серверу. Сначала получите токен аутентификации X с вашего хост-компьютера. Запустите xauth list и запишите один из перечисленных файлов cookie. Вам нужно будет скопировать всю строку.

Внутри контейнера Docker установите пакет xauth. Затем запустите xauth add, передав токен, скопированный на предыдущем шаге.

apt install -y xauth
xauth add <token>

Теперь ваш контейнер должен успешно пройти аутентификацию на X-сервере.

Другой подход — запуск VNC-сервера

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

Добавьте программное обеспечение VNC-сервера в свой контейнер:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox x11vnc xvfb
RUN echo "exec firefox" > ~/.xinitrc && chmod +x ~/.xinitrc
CMD ["v11vnc", "-create", "-forever"]

При запуске этого контейнера VNC-сервер будет создан автоматически. Вы должны привязать порт хоста к порту контейнера 5900 — это порт, на котором будет открыт VNC-сервер.

Firefox запускается при запуске, так как он добавляется в .xinitrc. Этот файл будет выполняться при запуске сервера VNC и инициализации нового дисплея.

Чтобы подключиться к серверу, вам понадобится клиент VNC на вашем хосте. Найдите IP-адрес вашего контейнера, запустив docker ps, запишите идентификатор контейнера и передайте его в docker inspect . Вы найдете IP-адрес в нижней части вывода в узле Network.

Используйте IP-адрес контейнера с вашим VNC-клиентом. Подключиться к порту 5900 без аутентификации. Теперь вы должны иметь возможность взаимодействовать с графическими программами, работающими в вашем контейнере Docker.

Заключение

У вас есть выбор из двух подходов при запуске графических программ в контейнерной среде. Для общего использования совместное использование X-сокета хоста обычно обеспечивает самое простое решение. Вы также можете запустить сервер VNC внутри контейнера. Этот подход может быть безопаснее, если вы не создавали образ контейнера.

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