logo rss

Comment exécuter une application graphique dans un conteneur Docker

Docker logo

Intro

Afin d'éviter de polluer son environnement GNU/Linux avec des applications que l'on souhaite juste tester il peut être interessant de pouvoir les installer dans un simple conteneur Docker. C'est relativement aisé avec des applications en ligne de commandes nous allons voir ici comment le faire avec des applications avec interface graphique.

Je fais ici le test avec le client de messagerie rocket et Mozilla Firefox.

Configuration

  • OS : Debian 9
  • Docker : 18.09.5

Application graphique dans Docker

Installation

  • Installer les paquets nécessaires pour pouvoir ajouter le dépot Docker :
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common gnupg2
  • Importer les clés gpg :
root@host:~# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
  • Ajouter le dépot Docker :
root@host:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
  • Rafraichir la liste de paquets :
root@host:~# apt update
  • Installer Docker :
root@host:~# apt install docker-ce
  • Vérifier l'état du service Docker :
root@host:~# systemctl status docker
  • Permettre à l'utilisateur user de lancer des commandes Docker (la session doit être relancer pour prise en compte) :
root@host:~# usermod -aG docker user

Installation de l'image Debian

  • Rechercher les images Debian :
user@debian: $ docker search debian
  • Télécharger l'image Debian :
user@debian: $ docker image pull debian
  • Éditer le fichier /home/user/Dockerfile :
FROM debian:9

RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y wget gconf2 gconf-service libnotify4 libappindicator1 libxtst6 libnss3 libxss1 libasound2 sudo
RUN wget https://github.com/RocketChat/Rocket.Chat.Electron/releases/download/2.15.1/rocketchat_2.15.1_amd64.deb
RUN dpkg -i rocketchat_2.15.1_amd64.deb

RUN export uid=1000 gid=1000 && \
    mkdir -p /home/user && \
    echo "user:x:${uid}:${gid}:Developer,,,:/home/user:/bin/bash" >> /etc/passwd && \
    echo "user:x:${uid}:" >> /etc/group && \
    echo "user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/user && \
    chmod 0440 /etc/sudoers.d/user && \
    chown ${uid}:${gid} -R /home/user


USER user
ENV HOME /home/user
CMD rocketchat-desktop
  • Créer une image rocket depuis le fichier Dockerfile :
user@debian: $ docker build -t rocket .

Lancer l'application graphique

user@debian: $ docker run -ti --rm -e DISPLAY  -v $HOME/.Xauthority:/home/user/.Xauthority --net=host rocket

Lancer deux applications

Voyons ici comment faire pour lancer dans le même temps firefox et rocket.chat depuis le même conteneur.

Script

  • Créer le fichier /home/user/applications.sh :
#! /bin/bash
firefox-esr&
rocketchat-desktop
  • Lui donner les droits en exécution :
chmod +x /home/user/applications.sh

Installation de l'image Debian

  • Modifier le fichier de configuration /home/user/Dockerfile :
FROM debian:9

RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y wget gconf2 gconf-service libnotify4 libappindicator1 libxtst6 libnss3 libxss1 libasound2 sudo firefox-esr
RUN wget https://github.com/RocketChat/Rocket.Chat.Electron/releases/download/2.15.1/rocketchat_2.15.1_amd64.deb
RUN dpkg -i rocketchat_2.15.1_amd64.deb

RUN export uid=1000 gid=1000 && \
    mkdir -p /home/user && \
    echo "user:x:${uid}:${gid}:Developer,,,:/home/user:/bin/bash" >> /etc/passwd && \
    echo "user:x:${uid}:" >> /etc/group && \
    echo "user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/user && \
    chmod 0440 /etc/sudoers.d/user && \
    chown ${uid}:${gid} -R /home/user


USER user
ENV HOME /home/user
COPY ./applications.sh /home/user/
CMD /home/user/applications.sh
  • Construire l'image fire-rocket depuis le fichier Dockerfile :
user@debian: $ docker build -t fire-rocket .
  • Lancer les applications graphiques
user@debian: $ docker run -ti --rm -e DISPLAY  -v $HOME/.Xauthority:/home/user/.Xauthority --net=host fire-rocket

Références

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact