Как вы можете запускать приложения с графическим интерфейсом в контейнере Docker ?
Есть ли какие-либо изображения, которые настроены vncserver
или что-то такое, что вы можете - например - добавить дополнительную песочницу SpeedBump вокруг, скажем, Firefox?
Ответы:
Вы можете просто установить vncserver вместе с Firefox :)
Я нажал изображение, VNC / Firefox, здесь:
docker pull creack/firefox-vnc
Изображение было сделано с этим Dockerfile:
Это создаст контейнер Docker с VNC с паролем
1234
:Для Docker версии 18 или новее:
Для Docker версии 1.3 или новее:
Для Docker до версии 1.3:
источник
docker inspect <container id>
или простоdocker ps
, затем вы подключаетесь к ip вашего хоста с портом, который вы только что нашли.Xauthority становится проблемой с более новыми системами. Я могу либо отменить любую защиту с помощью xhost + перед запуском моих док-контейнеров, либо передать хорошо подготовленный файл Xauthority. Типичные файлы Xauthority зависят от имени хоста. С помощью docker каждый контейнер может иметь свое имя хоста (устанавливается с помощью команды docker run -h), но даже установка имени хоста контейнера, идентичного системе хоста, в моем случае не помогла. xeyes (мне нравится этот пример) просто игнорирует волшебный cookie и не передает учетные данные на сервер. Следовательно, мы получаем сообщение об ошибке «Протокол не указан. Не удается открыть дисплей»
Файл Xauthority может быть записан таким образом, чтобы имя хоста не имело значения. Нам нужно установить для семейства аутентификации значение «FamilyWild». Я не уверен, если xauth имеет подходящую командную строку для этого, так что вот пример, который комбинирует xauth и sed для этого. Нам нужно изменить первые 16 бит вывода nlist. Значение FamilyWild равно 65535 или 0xffff.
источник
-v $XSOCK:$XSOCK -v $XAUTH:$XAUTH
может быть сокращено до-v $XSOCK -v $XAUTH
:0
на$DISPLAY
. Это значитxauth nlist $DISPLAY | ...
иdocker run -ti -e DISPLAY=$DISPLAY ...
. Обычно X DISPLAY есть:0
, но не всегда (и особенно если вы подключаетесь через ssh -X)./tmp/.docker.xauth
файл с600
разрешениями. Это приводит к тому, что xauth внутри Docker-контейнера не может прочитать файл. Вы можете проверить, запустивxauth list
в Docker контейнере. Я добавилchmod 755 $XAUTH
послеxauth nlist :0 | ...
команды, чтобы решить эту проблему.Я только что нашел эту запись в блоге и хочу поделиться ею здесь с вами, потому что я думаю, что это лучший способ сделать это, и это так просто.
http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
ПЛЮСЫ:
+ не
требуется x сервер в контейнере Docker + не требуется клиент / сервер vnc
+ нет ssh с переадресацией x
+ гораздо меньшие док-контейнеры
МИНУСЫ:
- использование x на хосте (не предназначено для безопасной песочницы)
на случай, если ссылка когда-нибудь выйдет из строя, я поместил здесь самую важную часть:
dockerfile:
построить изображение:
и команда запуска:
конечно, вы также можете сделать это в команде запуска с
sh -c "echo script-here"
ПОДСКАЗКА: для аудио взгляните на: https://stackoverflow.com/a/28985715/2835523
источник
apt-get -y install sudo
чтобы создать/etc/sudoers.d
папку.$ xhost +
С объемами данных докера очень легко вывести сокет домена xix unix внутри контейнера.
Например, с таким Dockerfile:
Вы можете сделать следующее:
Это, конечно, по сути то же самое, что и X-forwarding. Он предоставляет контейнеру полный доступ к xserver на хосте, поэтому рекомендуется, только если вы доверяете тому, что находится внутри.
Примечание. Если вы беспокоитесь о безопасности, лучшим решением было бы ограничить приложение обязательным или ролевым контролем доступа. Докер достигает довольно хорошей изоляции, но он был разработан с другой целью. Используйте AppArmor , SELinux или GrSecurity , которые были разработаны для решения вашей проблемы.
источник
xhost +
на хосте.xhost +local
необходимо. Однако было бы лучше сделать~/.Xauthority
файл доступным в контейнере, чтобы он мог аутентифицировать себя.Can't open display: :0
. Любые идеи?xhost +si:localuser:$USER
авторизовал только пользователя, запускающего контейнер.Вы также можете использовать подпользователя: https://github.com/timthelion/subuser
Это позволяет вам упаковать много приложений графического интерфейса в докер. Firefox и emacs были протестированы до сих пор. С Firefox WebGL не работает, хотя. Хром не работает вообще.
РЕДАКТИРОВАТЬ: Звук работает!
РЕДАКТИРОВАТЬ 2: С тех пор, как я впервые опубликовал это, subuser значительно прогрессировал. Теперь у меня есть веб-сайт subuser.org и новая модель безопасности для подключения к X11 через мост XPRA .
источник
OSX
У Юргена Вайгерта есть лучший ответ, который работал для меня в Ubuntu, однако в OSX докер работает внутри VirtualBox, поэтому решение не работает без дополнительной работы.
У меня это работает с этими дополнительными ингредиентами:
Я был бы признателен за комментарии пользователей, чтобы улучшить этот ответ для OSX, но я не уверен, что переадресация сокетов для X безопасна, но я предполагаю использовать его только для запуска контейнера Docker локально.
Кроме того, сценарий немного хрупок в том смысле, что нелегко получить IP-адрес компьютера, поскольку он находится на нашей локальной беспроводной сети, поэтому всегда есть какой-то случайный IP-адрес.
Сценарий BASH, который я использую для запуска контейнера:
Я могу заставить xeyes и matplotlib работать с этим подходом.
Windows 7+
В Windows 7+ с MobaXterm это немного проще:
run_docker.bash
:источник
error: XDG_RUNTIME_DIR not set in the environment.
иError: cannot open display: VAIO:0.0
. Вы сталкивались с чем-то вроде этого?Совместное использование дисплея хоста: 0, как указано в некоторых других ответах, имеет два недостатка:
xev
илиxinput
возможно, и удаленное управление хост-приложениями сxdotool
.--ipc=host
).Ниже приведен пример сценария для запуска образа докера в Xephyr, который решает эту проблему.
--cap-drop ALL --security-opt no-new-privileges
. Также пользователь контейнера не является пользователем root.Скрипт ожидает некоторых аргументов: сначала менеджер окон хоста будет запущен в Xephyr, второй образ докера, опционально третья команда образа, которая будет выполнена. Чтобы запустить среду рабочего стола в Docker, используйте «:» вместо менеджера окон хоста.
Закрытие окна Xephyr завершает работу приложений Docker-контейнера. Завершение закрепленных приложений закрывает окно Xephyr.
Примеры:
xephyrdocker "openbox --sm-disable" x11docker/lxde pcmanfm
xephyrdocker : x11docker/lxde
xephyrdocker xfwm4 --device /dev/snd jess/nes /games/zelda.rom
Скрипт xephyrdocker:
Этот скрипт поддерживается на x11docker wiki . Более продвинутый скрипт - x11docker, который также поддерживает такие функции, как ускорение графического процессора, совместное использование веб-камеры и принтера и так далее.
источник
Вот упрощенное решение, которое позволяет избежать необходимости устанавливать на
X
сервере любой сервер,vnc
сервер илиsshd
демон. То, что он получает в простоте, он теряет в безопасности и изоляции.Предполагается, что вы подключаетесь к хост-машине с
ssh
помощьюX11
переадресации.В
sshd
настройках хоста добавьте строкуТак что перенаправленный порт X-сервера на хосте открыт на всех интерфейсах (не только
lo
) и, в частности, на виртуальном интерфейсе Dockerdocker0
.Контейнеру при запуске необходим доступ к
.Xauthority
файлу, чтобы он мог подключиться к серверу. Чтобы сделать это, мы определяем том только для чтения, указывающий на домашний каталог на хосте (возможно, не мудрая идея!), И также устанавливаемXAUTHORITY
переменную соответственно.Этого недостаточно, мы также должны передать переменную DISPLAY от хоста, но подставив имя хоста ip:
Мы можем определить псевдоним:
И проверить это так:
источник
.Xauthority
сам файл:-v $HOME/.Xauthority:/root/.Xauthority -e XAUTHORITY=/root/.Xauthority
.X11UseLocalhost
вы также можете использовать дополнительную опцию--net=host
дляdocker run
команды (см. Здесь ).--net=host
это плохая идея, так как теперь, если вы откроете порт в контейнере, он будет открыт и в хосте ...Хотя ответ Юргена Вайгерта, по сути, охватывает это решение, мне сначала было не ясно, что там описывалось. Поэтому я добавлю свою точку зрения на случай, если кому-то еще понадобятся разъяснения.
Прежде всего, соответствующей документацией является X-страница безопасности .
Многочисленные источники в Интернете предлагают просто смонтировать сокет X11 unix и
~/.Xauthority
файл в контейнер. Эти решения часто работают на счастье, не понимая, почему, например, пользователь контейнера получает тот же UID, что и пользователь, поэтому нет необходимости в авторизации с помощью магического ключа.Прежде всего, файл Xauthority имеет режим 0600, поэтому пользователь контейнера не сможет прочитать его, если у него не будет того же UID.
Даже если вы скопируете файл в контейнер и измените владельца, существует еще одна проблема. Если вы работаете
xauth list
на хосте и контейнере с одним и тем жеXauthority
файлом, вы увидите разные записи в списке. Это потому, чтоxauth
фильтрует записи в зависимости от того, где он запущен.X-клиент в контейнере (т.е. приложение с графическим интерфейсом) будет вести себя так же, как
xauth
. Другими словами, он не видит магический файл cookie для сеанса X, запущенного на рабочем столе пользователя. Вместо этого он видит записи для всех «удаленных» сеансов X, которые вы открывали ранее (объяснено ниже).Итак, вам нужно добавить новую запись с именем хоста контейнера и тем же шестнадцатеричным ключом, что и файл cookie хоста (т. Е. Сеанс X, запущенный на вашем рабочем столе), например:
Уловка в том, что печенье должно быть добавлено
xauth add
внутри контейнера:В противном случае
xauth
пометьте его так, чтобы оно было видно только вне контейнера.Формат этой команды:
Где
.
представляетMIT-MAGIC-COOKIE-1
протокол.Примечание. Нет необходимости копировать или связывать-монтировать
.Xauthority
в контейнер. Просто создайте пустой файл, как показано, и добавьте cookie.Ответ Юргена Вайгерта обходит это, используя
FamilyWild
тип соединения, чтобы создать новый файл полномочий на хосте и скопировать его в контейнер. Обратите внимание, что сначала извлекается шестнадцатеричный ключ для текущего сеанса X из~/.Xauthority
использованияxauth nlist
.Итак, основные шаги:
FamilyWild
типом соединения).Я признаю, что не очень хорошо понимаю, как
FamilyWild
работает или какxauth
X-клиенты фильтруют записи из файла Xauthority в зависимости от того, где они запускаются. Дополнительная информация об этом приветствуется.Если вы хотите распространять свое приложение Docker, вам понадобится стартовый скрипт для запуска контейнера, который получает шестнадцатеричный ключ для сеанса X пользователя и импортирует его в контейнер одним из двух способов, описанных ранее.
Это также помогает понять механизм авторизации:
$DISPLAY
./tmp/.X11-unix
каталоге, смонтированном в контейнере.Примечание . Сокет Unix X11 по-прежнему необходимо монтировать в контейнере, иначе у контейнера не будет маршрута к X-серверу. Большинство дистрибутивов по умолчанию отключают доступ TCP к X-серверу.
Для получения дополнительной информации и лучшего понимания того, как работают отношения X клиент / сервер, полезно также рассмотреть пример пересылки SSH X:
$DISPLAY
в сеансе SSH для указания на свой собственный X-сервер.xauth
для создания нового файла cookie для удаленного хоста и добавляет его вXauthority
файлы как для локальных, так и для удаленных пользователей.источник
Это не просто, но это хорошее решение, которое обеспечивает паритет функциональности докера с полной виртуализацией рабочего стола. Оба Xfce4 или IceWM для Ubuntu и CentOS работают, и эта
noVNC
опция обеспечивает легкий доступ через браузер.https://github.com/ConSol/docker-headless-vnc-container
Он работает
noVNC
так же, какtigerVNC
и vncserver. Затем он вызываетstartx
данный оконный менеджер. Кроме того,libnss_wrapper.so
используется для эмуляции управления паролями для пользователей.источник
xpra
в докере, который является безруковым X. Онxpra
лучше всего подходил для IMO и более эффективен, чем VNC.--device /dev/...
к докеру и не установите необходимые--cap
привилегии. Это побеждает цель сдерживания, но вы можете пройти через устройства. С некоторой настройкой должно быть возможно запустить GNOME / KDE под VNC. Я запустил несколько X в докере с картами NVIDIA (без VNC или Xpra), так что это, безусловно, выполнимо.Решение, приведенное по адресу http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ , похоже, является простым способом запуска приложений с графическим интерфейсом изнутри контейнеров (я пробовал использовать Firefox over Ubuntu 14.04), но я обнаружил, что небольшое изменение требуется для решения, опубликованного автором.
В частности, для запуска контейнера автор упомянул:
Но я обнаружил, что (на основе конкретного комментария на том же сайте), что два дополнительных варианта
а также
необходимо указать при запуске контейнера для корректной работы firefox:
Я создал образ докера с информацией на этой странице и этими дополнительными данными: https://hub.docker.com/r/amanral/ubuntu-firefox/
источник
/tmp/.X11-unix
сокет вообще. Просто работает с креплением.Xauthority
и--net=host
./tmp/.X11-unix
тома больше не работает, так как Docker молча отказывается от монтирования тома из липких каталогов.--network=host
делает. Это дает вашему контейнеру полный доступ к сетевому стеку хоста, что может быть нежелательно, в зависимости от того, что вы пытаетесь сделать. Если вы просто возитесь с запуском контейнерных графических интерфейсов на рабочем столе, то это не должно иметь значения.Lord.garbage предлагает другое решение для запуска приложений с графическим интерфейсом в контейнере без использования перенаправления VNC, SSH и X11. Здесь тоже упоминается .
источник
Если вы хотите запустить приложение с графическим интерфейсом без головы, тогда читайте здесь . Что вам нужно сделать, это создать виртуальный монитор с помощью
xvfb
или другого подобного программного обеспечения. Это очень полезно, если вы хотите запускать тесты Selenium, например, в браузерах.Что-то нигде не упоминается, это то, что некоторые программы на самом деле сами используют песочницу с контейнерами Linux. Так, например, Chrome никогда не будет работать нормально, если вы не используете соответствующий флаг
--privileged
при запуске контейнера.источник
Я опаздываю на вечеринку, но для пользователей Mac, которые не хотят идти по пути XQuartz, вот рабочий пример, который создает образ Fedora с использованием среды рабочего стола (xfce)
Xvfb
иVNC
. Все просто и работает:На Mac вы можете просто получить к нему доступ, используя приложение Screen Sharing (по умолчанию), подключившись к
localhost:5901
.Dockerfile:
start-vnc.sh
Проверьте связанный readme для команд build и run, если хотите / нуждаетесь.
источник
Исходя из ответа Юргена Вейгерта , у меня есть некоторые улучшения:
Единственное отличие состоит в том, что он создает каталог $ XAUTH_DIR, который используется для размещения файла $ XAUTH и монтирования каталога $ XAUTH_DIR вместо файла $ XAUTH в док-контейнер.
Преимущество этого метода заключается в том, что вы можете написать команду в /etc/rc.local, которая должна создать пустую папку с именем $ XAUTH_DIR в / tmp и изменить ее режим на 777.
При перезапуске системы перед входом пользователя docker автоматически монтирует каталог $ XAUTH_DIR, если политика перезапуска контейнера «всегда». После входа в систему вы можете написать в ~ / .profile команду для создания файла $ XAUTH, тогда контейнер автоматически использует этот файл $ XAUTH.
В конце концов, контейнер будет автоматически получать файл Xauthority при каждом перезапуске системы и входе пользователя в систему.
источник
Другие решения должны работать, но вот решение для
docker-compose
.Чтобы исправить эту ошибку, вам нужно передать $ DISPLAY и .X11-unix в Docker, а также предоставить пользователю, запустившему Docker, доступ к xhost.
Внутри
docker-compose.yml
файла:В терминале или скрипте:
xhost +si:localuser:$USER
xhost +local:docker
export DISPLAY=$DISPLAY
docker-compose up
источник
Для рендеринга OpenGL с драйвером Nvidia используйте следующее изображение:
https://github.com/thewtex/docker-opengl-nvidia
Для других реализаций OpenGL убедитесь, что образ имеет ту же реализацию, что и хост.
источник
Вы можете разрешить пользователю Docker (здесь: root) доступ к дисплею X11:
источник
OSX (10.13.6, высокая Сьерра)
Похоже на ответ @Nick , но его решение у меня не сработало.
Сначала установите socat
brew install socat
и установите XQuartz ( https://www.xquartz.org/ ).Затем выполните следующие действия здесь ( http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ ) в разделе комментариев:
Я также смог запустить CLion из моего докерского контейнера Debian.
источник
Докер с сетью МОСТ. для Ubuntu 16.04 с менеджером отображения lightdm:
Вы можете использовать больше личных разрешений
источник
Еще один ответ, если вы уже создали изображение:
вызвать docker без sudo ( Как исправить docker: проблема с запрещенным доступом )
использовать один и тот же пользователь USER и home & passwd для общего ресурса хоста и контейнера (советы: используйте имя пользователя вместо имени пользователя)
папка dev для зависимых от драйвера библиотек для правильной работы
плюс Х11 вперед.
Вы можете спросить, какой смысл использовать докер, если так много всего одинакового? хорошо, одна причина, о которой я могу думать, состоит в том, чтобы преодолеть ад зависимости пакета ( https://en.wikipedia.org/wiki/Dependency_hell ).
Так что этот тип использования больше подходит для разработчика, я думаю.
источник
echo ~
: / home / $ {USER} --user =id -u ${USER}
--env = "DISPLAY" --volume = "/ etc / passwd: / etc / passwd: ro "-it РЕПО: TAG / bin / bashМне удалось запустить видео поток из камеры USB , используя
opencv
вdocker
выполнив следующие действия:Разрешить Docker доступ к X-серверу
Создайте сокет X11 Unix и файл аутентификации X
Добавьте правильные разрешения
Установите скорость рендеринга Qt на "native", чтобы она не обходила движок рендеринга X11
Скажите Qt не использовать MIT-SHM (разделяемая память) - таким образом, это также должно быть безопаснее с точки зрения безопасности
Обновите команду запуска докера
Примечание. По завершении проекта верните элементы управления доступом по умолчанию.
xhost -local:docker
Подробнее: использование графического интерфейса с Docker
Кредит: обнаружение объектов в режиме реального времени и обработки видео с использованием Tensorflow, OpenCV и Docker.
источник