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

А вот 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‑сервер ом уже есть на вашей рабочей станции.
Хотя можно, конечно.

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

Комментарии (3)


  1. lrrr11
    26.12.2024 01:48

    пользуйтесь distrobox, там из коробки настроен проброс всех нужных сокетов и переменных окружения для запуска GUI.

    К предыдущей статье тоже относится.


  1. sleirsgoevy
    26.12.2024 01:48

    Заголовок кликбейт. Я уж думала реально Xorg в контейнере запустят...

    А я запускала. Просто драйвер моей GPU выпилили из нового дебиана, и пришлось в привилегированном докере запустить Xorg из старого, а весь софт наоборот напрямую на хосте крутился.


    1. kulaginds
      26.12.2024 01:48

      В ubuntu 24.04 появилось обновление tigervnc server, который начал поддерживать OpenGL (даже с последними проприетарными дровами nvidia).

      Таким образом можно запустить контейнер с убунтой и tigervnc server с пробросом видеокарты.