Station de travail dans un conteneur Docker

Pour quoi? Toutes sortes d'idées me viennent constamment et je veux immédiatement essayer certaines d'entre elles, mais le poste de travail n'est pas toujours à portée de main, alors j'ai configuré l'IDE pour tout ce qui vient à portée de main. En conséquence, les appareils ont commencé à être encombrés et il est devenu difficile de les entretenir et de les mettre à jour.

Pour résoudre ce problème, j'ai décidé de placer un tel "cahier" dans le cloud, qui serait mis à jour quotidiennement et supprimer tous les déchets accumulés. Et pour travailler, connectez-vous à distance.

image

En conséquence, sans le soupçonner, il a créé un outil très pratique pour résoudre un grand nombre de tâches: un ordinateur portable, un site de test, pour voir ce que le téléphone n'affiche pas, un bac à sable sécurisé et l'exécution de scripts pour des programmes qui ne fonctionnent qu'avec l'interface graphique et bien d'autres. etc. Et dans l'article, je veux partager la méthode de création de tels conteneurs.

Pour créer un tel conteneur, vous devez écrire votre Dockerfile. Et dans l'article, je décrirai tout le processus de sa création. Qui ne veut pas se créer, mais veut prendre et essayer, alors au bas de l'article il y aura des liens vers des images toutes faites.

système opérateur


Tout Linux fera l'affaire. Personnellement, je préfère le beau OpenSuse, mais en comparant sa consommation de mémoire avec CentOS j'ai décidé de choisir ce dernier. En effet, moins un conteneur consomme de mémoire, plus vous économisez sur son hébergement.

Commençons par créer un dockerfile:

FROM centos:7

Accès à distance


Pour vous connecter au conteneur sur celui-ci, vous devez configurer le serveur d'accès à distance VNC. Pour cela, deux facteurs doivent être compris:

  1. Le système n'a pas de moniteur. Par conséquent, il devra être émulé. Il existe un serveur x0vncserver spécial pour cela.
  2. Le serveur VNC ne doit pas être ingénieux. Après tout, vous devez les payer. Et les retards dans la transmission du signal doivent être minimes, sinon ils provoquent une gêne.

Pour résoudre les deux problèmes, j'ai choisi TigerVNC Server pour le serveur et TightVNC pour le client. TigerVNC Server est inclus dans la livraison de tout Linux, léger, rapide et prend également en charge le travail sans moniteur via x0vncserver. Le client TightVNC fournit un transfert d'images si rapide qu'il donne l'impression qu'il ne s'agit pas d'une connexion à distance, mais d'un programme exécuté sur un ordinateur.

Étendez Dockerfile:

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/*

Après avoir installé les programmes, nous effaçons le cache pour alléger le poids de l'image.

Bureau


J'adore vraiment KDE avec le thème Breeze, mais KDE est un bureau très gourmand. Le gnome et ses dérivés étaient encore plus gourmands. Xfce, Ice n'est pas trop beau. Heureusement, il existe une solution - le bureau LXQT avec le thème Kde-Plasma.

Installez le bureau:

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/*

Un peu plus et vous pouvez courir.

Création d'utilisateurs


Dans le conteneur, il est nécessaire de travailler avec un utilisateur. Pour ce faire, créez-le et définissez un mot de passe, ainsi que définissez un mot de passe pour l'utilisateur root:

... Dockerfile

ENV HOME=/home/headless

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

Ici sans tête est l'utilisateur que nous créons et à partir duquel nous travaillerons, «centos» est le mot de passe spécifié par l'utilisateur et root. Il est préférable de le transmettre à partir de paramètres externes au démarrage du conteneur, mais même sous cette forme, le conteneur ne sera pas vulnérable, car la connexion sera protégée par mot de passe dans VNC via le mot de passe dans les arguments.

Configurer le démarrage du serveur vnc


Pour commencer, vous avez besoin d'un script auxiliaire qui configurera notre serveur VNC:

#!/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

Il doit être placé à côté du Dockefile, plus tard, il sera inclus dans le conteneur et le programme démarrera à partir de celui-ci. Dans ce fichier, vous devez spécifier la résolution dans laquelle vous prévoyez de travailler, par exemple, j'ai 1820x960 défini. Si vous spécifiez une taille inférieure à la taille de la fenêtre client, le serveur peut se bloquer en raison d'un manque de mémoire. Si vous spécifiez plus, l'image devra être mise à l'échelle et les éléments du bureau deviendront trop petits. Toujours dans ce script, un mot de passe sera défini à partir des variables qui seront passées dans les paramètres de lancement du conteneur.

Il reste à copier ce fichier dans le conteneur et à ajouter les paramètres de son lancement:

... 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"]

C'est tout, vous pouvez courir. Si vous êtes confus lors de la compilation du Dockerfile, sa version complète peut être trouvée dans mon référentiel et le conteneur fini dans le docker hub .

Pour démarrer le conteneur terminé, vous devez exécuter la commande:

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

Et connectez-vous à l'aide du client TightVNC.

image

Après la connexion, vous devez entrer le mot de passe utilisateur spécifié précédemment. Il est également recommandé de le changer immédiatement pour plus de sécurité.

Pour activer un beau design comme dans la capture d'écran ci-dessus, allez dans Démarrer> Préférences> Apparence> Thème LXQt et sélectionnez le thème Kde-plasma.

Programmes de travail


Vous pouvez maintenant créer une deuxième image avec des programmes de travail. Pour ce faire, prenez simplement l'image créée ci-dessus et complétez-la avec des scripts pour installer les packages:

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

Le script installe des outils pour le développement Typescript et C # sous Linux. Il s'agit de NodeJS, VS Code avec les extensions nécessaires et Monodevelop (alias Visual Studio pour Mac).

Cela commence aussi simple que l'image précédente:

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

Maintenant, en quelques secondes, vous pouvez déployer un environnement de travail propre.

image

Référentiels et images finies


Si vous avez besoin de référentiels et d'images prêts à l'emploi, ou si vous souhaitez améliorer ceux existants, par exemple, à travers les paramètres de démarrage, définissez le mot de passe utilisateur, la résolution d'écran ou redémarrez le serveur VNC après qu'il se bloque, alors bienvenue dans mes référentiels.

Image de base avec le bureau Gihub Dockerhub .

Image avec les outils Typescript et C # Gihub Dockerhub .

All Articles