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

Docker обычно используется для серверных и командных приложений. Однако, с правильной настройкой, вы также можете запускать графические приложения внутри контейнеров. Эти контейнеры могут включать графические библиотеки и инструменты отображения, которые позволяют приложениям работать в безопасной и изолированной среде. Этот подход упрощает разработку, тестирование и развертывание графических приложений на различных машинах или операционных системах. Этот гид проведет вас через процесс запуска графических приложений внутри контейнеров Docker с минимальной настройкой.
Понимание Docker и графических контейнеров Docker
Docker позволяет вам упаковать приложение вместе со всем, что ему нужно, таким как код, библиотеки и настройки, в самодостаточный блок, называемый контейнером. Эти контейнеры используют ядро хост-системы, что делает их легкими, быстрыми для запуска и эффективными по сравнению с полными виртуальными машинами.
Графические контейнеры — это настройки Docker, которые включают графические приложения, такие как Firefox, Gedit или другие настольные инструменты, позволяя их окнам появляться на вашем экране. В отличие от стандартных контейнеров, эти требуют дополнительной конфигурации для подключения к системе отображения хоста, что позволяет правильно отображать и взаимодействовать с графическими элементами.
Почему стоит запускать графические приложения в Docker?
Вот ключевые причины, почему запуск графических приложений в Docker может быть полезным:
- Когда вы запускаете графическое приложение в Docker, все, что ему нужно, такие как библиотеки и настройки, упаковано внутри контейнера. Это позволяет вашему основному системе оставаться свободной от беспорядка или конфликтов.
- Использование Docker означает, что ваше приложение будет работать одинаково на любой машине. Независимо от того, разрабатываете ли вы, тестируете или делитесь с другими, среда остается постоянной.
- Контейнеры упрощают тестирование нового приложения или отладку чего-либо. Вы можете запускать, приостанавливать или удалять их, не затрагивая вашу хост-машину.
- Docker позволяет запускать графические приложения Linux на системах, не являющихся Linux. Это достигается с помощью инструментов совместного использования дисплея, таких как XQuartz или VcXsrv, поэтому нет необходимости в виртуальной машине.
- В отличие от традиционных виртуальных машин, контейнеры Docker используют меньше системных ресурсов. Они запускаются быстрее и работают более плавно, даже для графических приложений.
Запуск графических приложений в Docker
Чтобы запустить графические приложения в Docker, вам сначала нужно убедиться, что Docker установлен на вашей системе Linux. Вы можете проверить это, выполнив следующую команду:
docker --versionЕсли эта команда возвращает номер версии, это означает, что Docker установлен и работает. Если нет, вы, вероятно, увидите ошибку “команда не найдена”.
После того, как Docker правильно настроен, вы можете перейти к следующим шагам.
Активировать службу Docker
Теперь запустите службу Docker, используя следующую команду:
sudo systemctl start dockerЧтобы проверить, работает ли служба Docker правильно, выполните:
sudo systemctl status dockerВывод подтверждает, что служба Docker активна и работает без каких-либо проблем:

Настройка папки проекта и Dockerfile
Давайте создадим директорию с именем “dockerGUI”, где мы будем хранить все файлы, связанные с Docker, для запуска графических приложений:
mkdir dockerGUIТеперь перейдите в эту директорию, чтобы убедиться, что все последующие файлы, которые мы создадим или изменим, будут храниться в папке dockerGUI:
cd dockerGUIСоздайте новый файл с именем dockerGUIFile, чтобы определить конфигурацию образа Docker:
nano dockerGUIFileТеперь вставьте следующие строки кода в dockerGUIFile:
FROM jess/firefox
ENV DISPLAY=:0
CMD ["firefox"]Вышеуказанный код говорит Docker использовать заранее собранный образ Firefox и устанавливает переменную окружения дисплея, чтобы графический интерфейс мог появиться на хост-системе. Более того, он гарантирует, что Firefox запускается автоматически при запуске контейнера.
Примечание: Чтобы попробовать другое приложение, просто измените образ и команду в вашем Dockerfile. Например, чтобы запустить Gedit, вы можете использовать официальный образ Ubuntu и установить приложение во время сборки следующим образом:
FROM ubuntu
RUN apt-get update && apt-get install -y gedit
ENV DISPLAY=:0
CMD ["gedit"]Сборка образа Docker
Теперь, когда конфигурация Docker настроена в dockerGUIFile, давайте соберем образ Docker, используя следующую команду:
sudo docker build -t myfirefox:1 -f dockerGUIFile .Эта команда собирает образ Docker из dockerGUIFile, называет его myfirefox с тегом 1 и использует текущую директорию в качестве контекста:

Запуск контейнера Docker с включенной поддержкой GUI
Теперь включите поддержку GUI для контейнеров Docker, выполнив следующую команду:
xhost +local:dockerВывод подтверждает, что локальным клиентам (таким как контейнеры Docker), работающим на моей системе, теперь разрешено подключаться к моему X-серверу:
Теперь запустите контейнер, используя следующую команду, чтобы запустить Firefox с поддержкой GUI на вашей хост-системе:
docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix myfirefox:1В результате эта команда подключает контейнер к вашему дисплею, что позволяет Firefox открываться на вашем экране так же, как и нативное приложение:

Примечание: Использование опции --rm заставляет Docker автоматически удалять контейнер после закрытия приложения, поддерживая вашу систему в чистоте и предотвращая его появление в docker ps -s.
Отключение Docker от X-сервера
После того, как вы закончили использовать графическое приложение, рекомендуется закрыть доступ к X-серверу по соображениям безопасности:
xhost -local:dockerЗаключительные мысли
Запуск графических приложений в Docker — отличный способ расширить возможности контейнеров за пределами командной строки. С правильной настройкой вы можете запускать настольные приложения из контейнера так, как если бы они были установлены на вашей системе. Это простой, но мощный подход для тестирования, разработки или изучения инструментов Linux в чистой среде. Начните создавать свои собственные контейнеры, готовые к GUI, и полностью используйте возможности, которые предлагает Docker на вашем рабочем столе Linux.