Бягам с пълен Linux десктоп в Docker просто защото мога
Както и аз, вероятно сте чули неофициалното правило на Docker: той е за леки, бездънни сървъри и приложения с команден ред, а не за графични интерфейси. Повечето от нас следват това правило с основателна причина - CLI е това, за което Docker е създаден. Но какво ще се случи, когато нарушите правилата?
Реших да направя нещо извън обичайното. Целта ми беше да стартирам напълно функциониращ Linux десктоп в контейнер. Не искам просто команден ред; искам напълно функционален графичен интерфейс, който съществува там, където не би трябвало. Ето какво се случи, когато опитах.
Защо всъщност правя това?
А защо някой би правил всичките тези усилия да използва Linux? В крайна сметка, можем просто да използваме VirtualBox или дори да инсталираме Linux до Windows. Моят отговор е прост: любопитство и желание за предизвикателство.
Интересувам се от Docker от известно време и, докато имам опит с пълно стеквато уеб разработване, нямам много опит в света на Docker и контейнеризацията. Исках да експериментирам с неща и да уча, като ги правя, така че този проект беше отговорът.
От самото начало знаех, че това няма да е лесно. Очаквах, че един ден, може би два дни максимум, ще са достатъчни, за да настроя графичната Linux система. Но реалността на предизвикателството беше точно обратната. Пречките, с които се сблъсквах през следващите четири дни, бяха напълно неочаквани и много по-сложни, отколкото бих могъл да си представя, изтегляйки търпението ми много по-далеч от това, за което бях подготвен.
Преди да се задълбочим в техническите детайли, ето малко контекст.
Целият този експеримент се проведе на компютър с Windows 10, воден от конкретен въпрос: какво ако можете да имате най-доброто от двата свята? Идеята за пълен Linux семеен работен плот, работещ в Docker контейнер, до стандартните ми Windows приложения, беше твърде интригуваща, за да бъде пренебрегната. Никакви рестартирания, без отделни дялове - просто безпроблемен, контейнеризиран Linux работен плот.
Така че първо трябваше да подготвя лабораторията си. Това означаваше инсталиране на Docker и настройване на WSL. С поставената основа, обнових основите на Docker и прочетох неговата документация. С това първоначалната ми подготовка беше завършена; сега беше време да приложа теорията на практика.
Стартиране на моя Docker контейнер
Моят първи опит да стартирам Linux десктоп в Docker беше, сега като се замисля, опит на начинаещ, продиктуван от прекомерна самоувереност. Реших да изградя персонализиран образ от нула. Ако сте нов в Docker, образът е самостоятелен пакет от всичко, което едно приложение нуждае, за да работи. Така че, след като сте създали образ, той ще работи по същия начин навсякъде, независимо от хардуера или операционната система.
Направих още една грешка от самото начало: разчитах много на инструмент с изкуствен интелект, за да генерирам кода за моето персонализирано изображение.
Ето урока, който научих трудом: Ако не разбираш технологията, не копирай и поставяй код, както направих аз. Прекарах часове в отстраняване на грешки без ясен път напред, пробивайки се през бъркотия от код, който не разбирах.
След като прекарах един цял ден по този непродуктивен път, най-накрая се отказах и смених тактиката. Моят нов подход беше прост: ще използвам предварително изградена изображение от Docker Hub. Можете да мислите за Docker Hub като за "магазин за приложения" за контейнерни изображения, пълен с решения, създадени и споделени от други разработчици. Това беше много необходима корекция и най-накрая позволи истинската работа да започне.
Първи лъч светлина: Добри неща и лоши неща
След неуспешния ми опит да създам персонализиран имидж, намерих обещаващ Debian имидж, базиран на XFCE, в Docker Hub. Свалих го за няколко минути и, с няколко команди, го стартирах. Когато отворих URL адреса, бях посрещнат от напълно функциониращ Linux десктоп, работещ директно в браузъра ми. Чистият гик радост от виждането на цяла операционна система, предоставяна от вътре в Docker контейнер, беше чувство, което никога няма да забравя. Работи!
Удобството беше изненадващо прилично. LibreOffice и GIMP работеха добре, макар и с известна забавяне. Щях да оценя производителността на около 70% от оригиналната, но все пак беше много използваема. Firefox също се стартира и дори опитах YouTube. Тогава се сблъсках с първата голяма пречка: цветовете бяха сиви и избледнели. Бързата проверка потвърди съмненията ми: браузърът използваше софтуерно рендериране. Моят GPU стоеше без работа.
Имаше още един проблем, който забелязах: Flatpak не работеше. Всяко опит за инсталиране на приложение от Flatpak завършваше с грешки, така че трябваше да прибегна до пакети на Debian. Въпреки тези ограничения, да видя комплетна Linux работна станция, работеща в браузъра ми и сервирана директно от Docker, беше огромна победа.
Настройване и учене
След няколко минути с XFCE, реших да сменя нещата и да опитам GNOME като моето десктоп средище. Голямо грешка! Отне ми часове за отстраняване на проблеми и поправяне на грешки, за да го накарам да заработи, а когато най-накрая стартира, беше бавно и взискателно към ресурсите. В крайна сметка, преглътнах гордостта си и се върнах към XFCE, и си казах, XFCE може и да не е впечатляващо, но е много по-отзивчиво. Така че нека се насочим към практичността.
С моето ново фокусиране върху производителността реших да преразгледам първия си опит: изграждането на персонализиран образ от нулата. Т този път проучвах Dockerfile на предварително изграденото изображение, което бях използвал преди. Исках да разбера точно какво се случва под капака и исках да видя дали мога да подобря производителността сам. Експериментирах с няколко нови конфигурации, специално опитвайки се да използвам xrdp вместо метода за пренос noVNC, за да видя дали различен протокол ще предложи по-гладко изживяване. Но не видях никаква разлика с xrdp.
За да репликирате, създайте файл с името "dockerfile", поставете кода и го изпълнете.
FROM ubuntu:jammy-20230425
RUN apt update && \
DEBIAN_FRONTEND=noninteractive apt install -y \
cinnamon locales sudo \
tigervnc-standalone-server tigervnc-common \
virtualgl mesa-utils mesa-vulkan-drivers \
dbus-x11 xterm wget && \
locale-gen en_US.UTF-8 && \
update-locale LANG=en_US.UTF-8
# Create user
# Enter the below username and passoword in xrdp login screen
ARG USER=user
ARG PASS=1234
RUN useradd -m $USER -p $(openssl passwd $PASS) && \
usermod -aG sudo $USER && \
chsh -s /bin/bash $USER
# Environment for Cinnamon
RUN echo "#!/bin/sh\n\
export XDG_SESSION_DESKTOP=cinnamon\n\
export XDG_SESSION_TYPE=x11\n\
export XDG_CURRENT_DESKTOP=X-Cinnamon\n\
export LIBGL_ALWAYS_INDIRECT=0\n\
exec cinnamon-session" > /home/$USER/.xinitrc && \
chown $USER:$USER /home/$USER/.xinitrc && chmod +x /home/$USER/.xinitrc
# Setup VNC password
RUN mkdir -p /home/$USER/.vnc && \
echo $PASS | vncpasswd -f > /home/$USER/.vnc/passwd && \
chmod 0600 /home/$USER/.vnc/passwd && \
chown -R $USER:$USER /home/$USER/.vnc
# Start script
RUN echo "#!/bin/bash\n\
export DISPLAY=:1\n\
Xvnc :1 -geometry 1920x1080 -depth 24 -SecurityTypes VncAuth -rfbport 5901 -localhost no &\n\
sleep 2\n\
sudo -u $USER startx &\n\
tail -f /dev/null" > /start && chmod +x /start
EXPOSE 5901
CMD ["/start"]
Изследване на Docker Hub
Ако всичко това звучи като твърде много работа, имам добри новини. Не е нужно да изграждате свое собствено изображение, за да започнете, нито да се справяте с грешки. Моето изследване ме доведе до две фантастични, готови за употреба решения, които предлагат много по-опростено изживяване.
- Webtop от LinuxServer.io: Това е чудесен опен сорс вариант, който предлага разнообразие от Linux десктоп версии, предварително опаковани като Docker изображения. Използва noVNC, за да достави десктопа директно в браузъра ви, а настройката е проста.
- Kasm Workspaces: Това е друга опция с отворен код за лична употреба.
Добрата вещ в тези изображения е, че всичко е предварително конфигурирано, особено Webtop. Просто изтеглете Docker изображението и го стартирайте. След като контейнерът работи, можете да получите достъп до вашия Linux, като въведете URL адреса. Изпълнението беше много по-добро от всичко, което бях опитвал преди, и, което е важно, имаше звукова поддръжка, което не срещнах с изображенията на Kasm.
За да стартирате Webtop, отворете CMD на Windows и поставете този код
docker run -d ^
--name webtop-xfce ^
-e PUID=1000 ^
-e PGID=1000 ^
-e TZ=Etc/UTC ^
-p 3000:3000 ^
--shm-size=1gb ^
lscr.io/linuxserver/webtop:latest
Открих няколко неочаквани предимства
Това, което започна като забавен проект за научаване на Docker и експериментиране с Linux контейнери, завърши с разкритие на някои изненадващо полезни функции по пътя. Най-голямото откритие и мой личен "аха!" момент беше осъзнаването на силата на достъпа до отдалечен работен плот.
Когато видях пълния Linux десктоп, работещ в браузъра ми, ми хрумна едра идея: какво ако го достъпя от устройство с по-слаба мощност? Хванах Chromebook-а си—скромна машина с Intel Celeron процесор—отвори URL-то и ето го: пълната мощност на основния ми компютър, стриймвана на Chromebook-а ми. Изведнъж не бях привързан към бюрото си. Могах да продължа да работя от дивана или от всяко друго място в къщата. Моят слаб Chromebook се превърна в високо производствен прозорец към десктопа ми, благодарение на контейнера.
За най-доброто изживяване, използвайте кабелна Ethernet връзка или бърза Wi-Fi мрежа с 5 GHz.
Освен това, можех да видя няколко други предимства:
- Еднократни пясъчници: Можех да тествам и да развалям неща в Linux среда без страх от разваляне на основната ми ОС. Перфектна площадка за рискови експерименти.
- Частно сърфиране: Мога да стартирам нов контейнер, да използвам уеб браузър и след това да изтрия цялата среда с едно щракване, оставяйки без следа.
- Посветени работни пространства: Мога да създам персонализирани Linux изображения, пригодени за специфични задачи - среда за писане без разсейване, настройка за кодиране с всички мои инструменти за разработка предварително инсталирани.
Тази гъвкавост отвори възможности, които дори не бях обмислял, когато започвах проекта.
Какво следва? Моите недовършени експерименти
Докато видях със собствените си очи, че е възможно да се използва Linux десктоп в Docker, моето пътешествие не е приключило. Имаше няколко експеримента, които исках да направя, но не ми остана време за тях:
- Flatpak и Snap Store: Бих искал да разбера как да накарам тези магазини за приложения да работят вътре в контейнера, за да разширя библиотеката със софтуер.
- Игри: Без GPU пропускане, това нямаше да е възможно, но съм любопитен да намеря решение за това.
- Допълнителна оптимизация: Искам да продължа да настройвам конфигурацията, за да видя дали мога да извлека още по-добра производителност и да намаля времето за реакция.
Защо е трудно да се стартира Linux в Docker?
И така, сега когато разбрах, че стартирането на пълна работна среда в контейнер и очакването тя да се държи като нормален десктоп в Windows е възможно, но болезнено, крехко и много по-трудно от стартирането на виртуална машина. Основните причини за това са:
- Контейнерите не са изолирани операционни системи: Контейнерите на Docker споделят ядрото на хоста. Това ги прави леки и подходящи за единични услуги. Докато десктоп средите очакват системни услуги като (systemd, logind, udev, DBus) и достъп до устройства да бъдат налични. Контейнерите не предоставят това по подразбиране.
- Няма вградени дисплейни сървъри: Графичните потребителски интерфейси на Linux се нуждаят от композитор/дисплейен сървър (X11 или Wayland). Контейнерът не предоставя такъв, така че трябва да го направим сами.
- Достъп до GPU: Контейнерите не виртуализират GPU по подразбиране, така че трябва да предадете устройствените възли в контейнера. А на Windows има допълнителен слой WSL, който трябва да преминете.
Беше ли си струвало?
Абсолютно. Това беше забавен и дълбоко удовлетворяващ проект. Научих много за вътрешната работа на Docker и Linux, и има специален вид удовлетворение, който идва от отстраняване на проблеми с часове и най-накрая виждане на резултатите от работата си.
Така че, бих го препоръчал? Да, особено ако сте любопитни и търсите нестандартен проект за уикенда. Но дори и да не сте, практическите ползи, които открих - като достъп до компютъра от разстояние, еднократни тестови среди и специализирани работни пространства - правят това далеч повече от експеримент. Виждам практическо приложение тук.
Въпреки че неофициалните правила на Docker са там по някаква причина, понякога най-ценните уроци се намират, когато ги нарушиш. Така че, стартирайте терминала си, вземете предварително изградена изображение (или бъдете смели и изградете свое собствено!) и вижте магията сами. Може също така да намерите някои неочаквани предимства по пътя.











