Agence web » Actualités du digital » Comment exécuter des applications GUI dans un conteneur Docker –

Comment exécuter des applications GUI dans un conteneur Docker –

Docker est normalement utilisé pour conteneuriser les applications d’arrière-plan et les programmes CLI. Vous pouvez également l’utiliser pour exécuter des programmes graphiques! Vous pouvez soit utiliser un serveur X existant, sur lequel la machine hôte exécute déjà un environnement graphique, soit exécuter un serveur VNC dans le conteneur.

Tout d’abord, il est important de comprendre ce que fait réellement Docker. Un «conteneur» Docker est une forme d’encapsulation qui semble superficiellement similaire à une machine virtuelle. Contrairement à une machine virtuelle, les conteneurs partagent le même noyau Linux que leur système hôte.

Le composant suivant est le système X Window. Les serveurs X tels que Xorg fournissent les capacités graphiques fondamentales des systèmes Unix. Les applications GUI ne peuvent pas être rendues sans un serveur X disponible. (Des systèmes de fenêtrage alternatifs, tels que Wayland, sont disponibles – nous nous concentrons sur X dans cet article.)

Essayer d’exécuter un serveur X dans Docker est théoriquement possible mais rarement utilisé. Vous devez exécuter Docker en mode privilégié (--privileged) afin qu’il puisse accéder au matériel de votre hôte. Le démarrage du serveur essaierait de réclamer vos périphériques vidéo, ce qui entraînerait généralement une perte de sortie vidéo lorsque le serveur X d’origine de votre hôte récupère ses périphériques.

Une meilleure approche consiste à monter le socket X Server de votre hôte dans le conteneur Docker. Cela permet à votre conteneur d’utiliser le serveur X que vous possédez déjà. Les applications GUI exécutées dans le conteneur apparaîtront alors sur votre bureau existant.

Pourquoi exécuter des applications GUI dans Docker?

L’exécution d’un programme GUI dans Docker peut être une technique utile lorsque vous évaluez un nouveau logiciel. Vous pouvez installer le logiciel dans un conteneur propre, au lieu d’avoir à polluer votre hôte avec de nouveaux packages.

Cette approche vous permet également d’éviter toute incompatibilité avec d’autres packages de votre environnement. Si vous devez exécuter temporairement deux versions d’un programme, vous pouvez utiliser Docker pour éviter d’avoir à supprimer et réinstaller le logiciel sur votre hôte.

Transférer un socket X vers un conteneur Docker

Fournir à un conteneur Docker un accès au socket X de votre hôte est une procédure simple. La prise X se trouve dans /tmp/.X11-unix sur votre hôte. Le contenu de ce répertoire doit être monté dans un volume Docker affecté au conteneur. Vous devrez utiliser le host mode réseau pour que cela fonctionne.

Vous devez également fournir au conteneur un DISPLAY variable d’environnement. Cela indique aux clients X – vos programmes graphiques – à quel serveur X se connecter. Régler DISPLAY dans le conteneur à la valeur de $DISPLAY sur votre hôte.

Vous pouvez encapsuler toute cette configuration en un docker-compose.yml déposer:

version: "3"

services:
  app:
    image: my-app:latest
    build: .
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
    network_mode: host

Ensuite, vous devez créer un Dockerfile pour votre application. Voici un exemple qui exécute le navigateur Web Firefox:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox
CMD ["/usr/bin/firefox"]

Maintenant, créez et exécutez l’image:

docker-compose build
docker-compose up

Une nouvelle fenêtre Firefox devrait apparaître sur votre bureau! L’instance Firefox s’exécutera dans le conteneur, indépendamment de toute autre fenêtre Firefox ouverte. Le conteneur partagera le socket X de votre hôte, de sorte que Firefox en conteneur apparaîtra toujours sur votre bureau.

Cette approche ne doit être utilisée que lorsque vous faites confiance à votre conteneur Docker. L’exposition du serveur d’affichage de l’hôte est un risque pour la sécurité si vous n’êtes pas complètement sûr de ce qui se trouve à l’intérieur du conteneur.

Gestion de l’authentification X

Vous devrez peut-être authentifier le conteneur pour accéder au serveur X. Obtenez d’abord un jeton d’authentification X de votre machine hôte. Cours xauth list et notez l’un des cookies répertoriés. Vous devrez copier la ligne entière.

À l’intérieur du conteneur Docker, installez le xauth emballer. Puis courez xauth add, en transmettant le jeton que vous avez copié à l’étape précédente.

apt install -y xauth
xauth add <token>

Votre conteneur devrait maintenant s’authentifier avec succès auprès du serveur X.

Une autre approche – Exécution d’un serveur VNC

Si vous ne parvenez pas à utiliser le transfert de socket X, vous pouvez configurer un serveur VNC dans votre conteneur. Cette approche vous permet d’afficher les applications graphiques dans le conteneur en vous connectant à partir d’un client VNC s’exécutant sur l’hôte.

Ajoutez le logiciel serveur VNC à votre conteneur:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox x11vnc xvfb
RUN echo "exec firefox" > ~/.xinitrc && chmod +x ~/.xinitrc
CMD ["v11vnc", "-create", "-forever"]

Lorsque vous exécutez ce conteneur, un serveur VNC est créé automatiquement. Vous devez lier un port hôte au port 5900 du conteneur – c’est le port sur lequel le serveur VNC sera exposé.

Firefox est lancé au démarrage au fur et à mesure qu’il est ajouté à .xinitrc. Ce fichier sera exécuté lorsque le serveur VNC lancera et initialisera un nouvel affichage.

Pour vous connecter au serveur, vous aurez besoin d’un client VNC sur votre hôte. Trouvez l’adresse IP de votre conteneur en exécutant docker ps, en notant l’ID du conteneur et en le transmettant à docker inspect <container>. Vous trouverez l’adresse IP en bas de la sortie, dans le Network nœud.

Utilisez l’adresse IP du conteneur avec votre client VNC. Connectez-vous sur le port 5900 sans authentification. Vous devriez maintenant pouvoir interagir avec les programmes graphiques exécutés dans votre conteneur Docker.

Conclusion

Vous avez le choix entre deux approches lors de l’exécution de programmes graphiques dans un environnement conteneurisé. Pour une utilisation générale, le partage de la socket X de l’hôte fournit généralement la solution la plus simple. Vous pouvez également choisir d’exécuter un serveur VNC dans le conteneur. Cette approche peut être plus sûre lorsque vous n’avez pas créé l’image de conteneur.

Les applications graphiques conteneurisées sont utiles lorsque vous évaluez un logiciel ou que vous devez exécuter deux versions d’un package. Vous pouvez utiliser des programmes sur votre bureau existant sans avoir à toucher à la configuration de votre hôte.

★★★★★