«А теперь засунем X-сервер в контейнер»

Когда я писал про использование Докера как контейнера с инструментами для работы — вообще-то речь шла про использование прежде всего доступа через шелл.
Ну в самом деле: файлы они и в Африке файлы, редактирую я их Vim-ом, потому что это удобно, перемещаю MidnightCommander-ом, по той же причине, для обработки используются Makefile, и всё это окна терминалов.
Во множественном числе.

d9b3398783b5e40ca38c40b316ba80e9.png

А вот IDE, которые в графическом режиме, как-то не прижились. Ну неудобно, особенно когда меняется версия IDE, а тебе надо поднять старый «проект», который в новой версии без плясок с бубном не соберешь, потому что теперь поменяли то и это, хотя по сути всё сводится все к тем же файлам, библиотекам и скриптам компоновки.
В общем, не понравилось.

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

Если контейнер работает локально — всё просто:
В контейнере устанавливаем xauth и какой-нибудь эмулятор терминала:
(почему именно xfce4-terminal — чуть дальше. Но не обязательно его, конечно)

apt install xauth xfce4-terminal

И запускаем контейнер например так:

docker run -ti --net host --name x1 my_toolbox
exit
docker start x1
docker exec -d --env DISPLAY=$DISPLAY --user my_user x1 /usr/bin/xfce4-terminal

То есть, указываем переменную окружения DISPLAY на X-сервер хоста, указываем юзера, созданного внутри контейнера, имя контейнера и программу терминала, которая будет запущена. Связь при этом будет идти по сети, через 127.0.0.1

Можно создать контейнер иначе:

docker run -ti -v /tmp/.X11-unix:/tmp/.X11-unix --user my_user x1 /usr/bin/xfce4-terminal

в этом случае связь будет идти через UNIX-сокет типа /tmp/.X11-unix/X0
В остальном все так же.

Для того чтобы работала кириллица при вводе нужно также указать локаль, хотя бы LANG=C.UTF-8
А лучше вообще создать отдельный скрипт, например runx

#!/bin/sh

LANG=C.UTF-8; export LANG
DISPLAY=:0; export DISPLAY 

/usr/bin/xfce4-terminal

и запускать его:

docker exec -d --user my_user x1 /home/my_user/bin/runx

Ну, в общем, и всё. Если терминал работает — значит, всё работает.
Конкретно у xfce4-terminal есть удобные настройки внешнего вида, возможность задать имя для заголовка конкретного окна (особенно полезно когда окон к разным системам много), и удобная функция открывать новые окна простой комбинацией кнопок, не запуская всё это вручную.

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

Конечно, никакой X-сервер никто в контейнер не засунул: X-сервер это как правило рабочая станция, за которой вы сидите, с монитором, клавиатурой и графической картой, а подключаются к нему программы-клиенты, тот же эмулятор терминала.

Также нет никакой необходимости устанавливать в контейнере «полноразмерный» Desktop Environment — всё это вместе с X-сервером уже есть на вашей рабочей станции.
Хотя можно, конечно.

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

© Habrahabr.ru