Ответ 1
Существует хороший и полулегкий способ получения графического вывода из
Контейнер-докер, не запуская демон sshd
внутри
контейнер. Docker может обеспечить голые характеристики металла при запуске одного
процесс, который в этом случае должен быть R
. Запуск демона sshd
будет, как это ни парадоксально, вводить дополнительные накладные расходы. Это не
лучше работает, запустив демона sshd в качестве дочернего процесса
супервизор. Оба можно обойтись, если вы
привязать крепления. После создания изображения, из которого предполагается контейнер
для запуска мы запускаем интерактивный контейнер и привязываем
/tmp/.X11-unix
в него. Я укажу полную команду и
подробно объясните, что он делает:
docker run -i -t -rm\
-
-i
устанавливает интерактивный сеанс;-t
выделяет псевдо tty;--rm
делает этот контейнер эфемерным
-e DISPLAY = $DISPLAY\
- устанавливает отображение хоста на дисплей локальных компьютеров (обычно это будет
:0
)
-u docker\
-
-u
указать, что процесс должен запускаться пользователем (здесьdocker
), а не root. Этот шаг важен (v.i.)!
-v/tmp/.X11-unix:/tmp/.X11-unix:ro\
-
-v
bind монтирует сокетX11
, находящийся в/tmp/.X11-unix
на вашем локальном компьютере, в/tmp/.X11-unix
в контейнере, а:ro
делает только сокет.
- name= "rdev" ubuntu-r R
-
--name=""
укажите имя контейнера (здесьrdev
); изображение, из которого вы хотите запустить контейнер (здесьubuntu-r
); процесс, который вы хотите запустить в контейнере (здесьR
). (Последний шаг указания процесса необходим только в том случае, если вы не задали по умолчаниюCMD
илиENTRYPOINT
для вашего изображения.)
После выдачи этой команды вы должны смотреть на красивый R
начало производства. Если вы хотите попробовать demo(graphics)
, чтобы увидеть,
выход уже работает, вы заметите, что это не так. Это потому
расширения Xsecurity
, предотвращающего доступ к сокету. Вы
теперь можно ввести xhost +
на вашем локальном компьютере и попробовать demo(graphics)
в
ваш контейнер снова. Теперь вы должны иметь графический вывод. Этот метод
однако настоятельно не рекомендуется, поскольку вы разрешаете доступ к вашему xsocket для
любой удаленный хост, к которому вы в настоящее время подключены. Пока вы только
взаимодействуя с однопользовательскими системами, это может быть как-то оправданным, но
как только будет задействовано несколько пользователей, это будет абсолютно
небезопасный! Следовательно, вы должны использовать менее опасный метод. Хорошим способом является
использовать интерпретируемый сервер
xhost +si:localuser:username
который может использоваться для указания одного локального пользователя (см. man xhost
). Это означает
username
должно быть именем пользователя, который запускает сервер X11
вашей локальной машине и которая запускает контейнер докеров. Это также
причина, почему важно указать пользователя при запуске
контейнер. И последнее, но не менее важное: всегда есть более сложное решение
используя файлы xauth
и .Xauthority
для предоставления доступа к сокету X11
(см. man xauth
). Это, однако, также потребует немного больше знаний
как работает X
.
Положительный эффект, который это может иметь, можно увидеть в количестве процессов которые необходимо запустить для достижения желаемого.
(1) с supervisor
и sshd
, запущенным в контейнере:
UID PID PPID C STIME TTY TIME CMD
root 4564 718 1 18:16 ? 00:00:00 /usr/bin/python /usr/bin/supervisord
root 4576 4564 0 18:16 ? 00:00:00 /usr/sbin/sshd
при входе через ssh
и запуске R
:
UID PID PPID C STIME TTY TIME CMD
root 4564 718 0 18:16 ? 00:00:00 /usr/bin/python /usr/bin/supervisord
root 4576 4564 0 18:16 ? 00:00:00 /usr/sbin/sshd
root 4674 4576 0 18:17 ? 00:00:00 sshd: docker [priv]
chb 4725 4674 0 18:18 ? 00:00:00 sshd: [email protected]/0
chb 4728 4725 1 18:18 pts/0 00:00:00 -bash
(2) с методом привязки привязки:
UID PID PPID C STIME TTY TIME CMD
chb 4356 718 0 18:12 pts/4 00:00:00 /usr/local/lib/R/bin/exec/R --no-save --no-restore