Workstation in einem Docker-Container

Wofür? Alle Arten von Ideen kommen ständig zu mir und einige davon möchte ich sofort ausprobieren, aber die Workstation ist nicht immer zur Hand, deshalb habe ich die IDE für alles eingerichtet, was zur Hand ist. Infolgedessen wurden die Geräte unübersichtlich, und es wurde schwierig, sie zu warten und zu aktualisieren.

Um dieses Problem zu lösen, habe ich beschlossen, ein solches „Notizbuch“ in die Cloud zu stellen. Dieses wird täglich aktualisiert und löscht den gesamten angesammelten Müll. Und um zu arbeiten, stellen Sie eine Remote-Verbindung her.

Bild

Ohne es zu ahnen, entwickelte er ein sehr praktisches Tool zum Lösen einer Vielzahl von Aufgaben: ein Notizbuch, eine Testsite, um zu sehen, was das Telefon nicht anzeigt, eine sichere Sandbox und das Ausführen von Skripten für Programme, die nur auf der GUI und vielen anderen funktionieren. usw. Und in dem Artikel möchte ich die Methode zum Erstellen solcher Container teilen.

Um einen solchen Container zu erstellen, müssen Sie Ihre Docker-Datei schreiben. Und in dem Artikel werde ich den gesamten Prozess seiner Entstehung beschreiben. Wer sich nicht selbst erschaffen will, sondern nehmen und versuchen will, findet am Ende des Artikels Links zu fertigen Bildern.

Operationssystem


Jedes Linux wird es tun. Persönlich bevorzuge ich die schöne OpenSuse, aber als ich ihren Speicherverbrauch mit CentOS verglich, entschied ich mich für Letzteres. Je weniger Speicher ein Container verbraucht, desto mehr können Sie beim Hosting sparen.

Beginnen wir mit der Erstellung einer Docker-Datei:

FROM centos:7

Fernzugriff


Um eine Verbindung zu dem darauf befindlichen Container herzustellen, müssen Sie den VNC-RAS-Server konfigurieren. Hierfür sind zwei Faktoren zu verstehen:

  1. Das System hat keinen Monitor. Daher muss es emuliert werden. Hierfür gibt es einen speziellen x0vncserver-Server.
  2. VNC Server sollte nicht einfallsreich sein. Immerhin muss man dafür bezahlen. Und die Verzögerungen bei der Signalübertragung sollten minimal sein, sonst verursachen sie Unbehagen.

Um beide Probleme zu lösen, habe ich TigerVNC Server für den Server und TightVNC für den Client ausgewählt. TigerVNC Server ist in der Lieferung von Linux enthalten, leichtgewichtig, schnell und unterstützt auch die Arbeit ohne Monitor über x0vncserver. Der TightVNC-Client bietet eine so schnelle Übertragung von Bildern, dass es sich nicht um eine Remoteverbindung handelt, sondern um ein Programm, das auf einem Computer ausgeführt wird.

Dockerfile erweitern:

FROM centos:7

RUN yum install -y epel-release dnf \
        && \
        dnf install -y \
            tigervnc-server \
        && \
        yum clean all && dnf clean all \
        && \
        rm -rf /var/cache/yum/* && rm -rf /var/cache/dnf/*

Nach der Installation der Programme leeren wir den Cache, um das Image zu entlasten.

Desktop


Ich liebe KDE wirklich mit dem Breeze-Thema, aber KDE ist ein sehr gefräßiger Desktop. Gnom und seine Derivate waren noch gefräßiger. Xfce, Eis ist nicht zu schön. Zum Glück gibt es eine Lösung - den LXQT-Desktop mit dem Kde-Plasma-Thema.

Installieren Sie den Desktop:

FROM centos:7

RUN yum install -y epel-release dnf \
        && \
        dnf install -y \
            tigervnc-server \
            openbox obconf-qt \
            lxqt-about lxqt-common lxqt-config lxqt-globalkeys lxqt-notificationd \
            lxqt-openssh-askpass lxqt-panel lxqt-policykit lxqt-qtplugin lxqt-runner \
            lxqt-session pcmanfm-qt \
            dejavu-sans-mono-fonts \
            xterm nano htop expect sudo \
        && \
        yum clean all && dnf clean all \
        && \
        rm -rf /var/cache/yum/* && rm -rf /var/cache/dnf/*

Ein bisschen mehr und du kannst rennen.

Benutzererstellung


Im Container muss von einem Benutzer gearbeitet werden. Erstellen Sie dazu ein Kennwort und legen Sie ein Kennwort sowie ein Kennwort für den Root-Benutzer fest:

... Dockerfile

ENV HOME=/home/headless

RUN /bin/dbus-uuidgen --ensure && \
        useradd headless && \
        echo "centos" | passwd --stdin root && \
        echo "centos" | passwd --stdin headless

Hier ist der Benutzer, den wir erstellen und von dem aus wir arbeiten, kopflos. "Centos" ist das vom Benutzer und root angegebene Kennwort. Es ist besser, es von externen Parametern zu übergeben, wenn der Container gestartet wird, aber selbst in dieser Form ist der Container nicht anfällig, weil Die Verbindung wird in VNC über das Passwort in den Argumenten passwortgeschützt.

Konfigurieren Sie den Start des vnc-Servers


Zum Starten benötigen Sie ein Hilfsskript, mit dem unser VNC-Server konfiguriert wird:

#!/usr/bin/expec

spawn /usr/bin/vncserver :1 -fg -geometry 1820x960
expect "Password:"
send "$env(password)\r"
expect "Verify:"
send "$env(password)\r"
expect "Would you like to enter a view-only password (y/n)?"
send "n\r"

set timeout -1
expect eof

Es muss neben dem Dockefile abgelegt werden, später wird es in den Container aufgenommen und das Programm startet von dort aus. In dieser Datei müssen Sie die Auflösung angeben, in der Sie arbeiten möchten, z. B. habe ich 1820x960 festgelegt. Wenn Sie weniger als die Größe des Client-Fensters angeben, kann der Server aufgrund von Speichermangel abstürzen. Wenn Sie mehr angeben, muss das Bild skaliert werden und die Elemente des Desktops werden zu klein. Auch in diesem Skript wird ein Kennwort aus den Variablen festgelegt, die in den Container-Startparametern übergeben werden.

Diese Datei muss noch in den Container kopiert und die Parameter für den Start hinzugefügt werden:

... Dockerfile

COPY ./startup.sh ${HOME}
RUN mkdir -p ${HOME}/.vnc \
        && \
        echo '#!/bin/sh' > ${HOME}/.vnc/xstartup && \
        echo 'exec startlxqt' >> ${HOME}/.vnc/xstartup && \
        chmod 775 ${HOME}/.vnc/xstartup \
        && \
        chown headless:headless -R ${HOME}


WORKDIR ${HOME}
USER headless
ENTRYPOINT ["expect", "./startup.sh"]

Das ist alles, du kannst rennen. Wenn Sie beim Kompilieren der Docker-Datei verwirrt sind, finden Sie die Vollversion in meinem Repository und den fertigen Container im Docker-Hub .

Um den fertigen Container zu starten, müssen Sie den folgenden Befehl ausführen:

docker run -it --rm -e password='YOUR_VNC_PASSWORD' -p5901:5901 labeg/centos-lxqt-vnc

Stellen Sie eine Verbindung mit dem TightVNC-Client her.

Bild

Nach dem Herstellen der Verbindung müssen Sie das zuvor angegebene Benutzerkennwort eingeben. Es wird auch empfohlen, es sofort zu ändern, um die Sicherheit zu erhöhen.

Um ein schönes Design wie im obigen Screenshot zu aktivieren, gehen Sie zu Start> Einstellungen> Darstellung> LXQt-Thema und wählen Sie das Kde-Plasma-Thema aus.

Programme für die Arbeit


Jetzt können Sie mit Arbeitsprogrammen ein zweites Bild erstellen. Nehmen Sie dazu einfach das oben erstellte Image und ergänzen Sie es mit Skripten für die Installation von Paketen:

FROM labeg/centos-lxqt-vnc:latest

USER root

# dotnet vscode monodevelop nodejs git2
RUN rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm \
        && \
        rpm --import https://packages.microsoft.com/keys/microsoft.asc && \
        sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo' \
        && \
        rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF" && \
        su -c 'curl https://download.mono-project.com/repo/centos7-vs.repo | tee /etc/yum.repos.d/mono-centos7-vs.repo' \
        && \
        yum install -y https://centos7.iuscommunity.org/ius-release.rpm \
        && \
        curl -sL https://rpm.nodesource.com/setup_13.x | bash - \
        && \
        dnf install -y geany git2u git2u-gui code monodevelop firefox dotnet-sdk-3.1 nodejs gnome-terminal gnome-system-monitor \
        && \
        npm install -g gulp typescript npm-check-updates \
        && \
        chown headless:headless -R ${HOME}

USER headless

RUN code --install-extension ms-vscode.vscode-typescript-tslint-plugin && \
    code --install-extension dbaeumer.vscode-eslint && \
    code --install-extension mrmlnc.vscode-scss && \
    code --install-extension visualstudioexptteam.vscodeintellicode && \
    code --install-extension ms-dotnettools.csharp && \
    code --install-extension joelday.docthis && \
    code --install-extension mrmlnc.vscode-remark && \
    code --install-extension eamodio.gitlens

Das Skript installiert Tools für die Typescript- und C # -Entwicklung unter Linux. Dies ist NodeJS, VS Code mit den erforderlichen Erweiterungen und Monodevelop (auch bekannt als Visual Studio für Mac).

Es beginnt so einfach wie das vorherige Bild:

docker run -it --rm -e password='YOUR_VNC_PASSWORD' -p5901:5901 labeg/devpc

Jetzt können Sie in Sekundenschnelle eine saubere Arbeitsumgebung bereitstellen.

Bild

Repositories und fertige Bilder


Wenn Sie vorgefertigte Repositorys und Images benötigen oder vorhandene Repositorys verbessern möchten, z. B. über die Startparameter, legen Sie das Benutzerkennwort und die Bildschirmauflösung fest oder starten Sie den VNC-Server nach dem Absturz neu. Willkommen in meinen Repositorys.

Grundlegendes Bild mit dem Gihub Dockerhub Desktop .

Bild mit Typescript- und C # Gihub Dockerhub-Tools .

All Articles