Comment pouvez-vous courir applications GUI dans un conteneur de docker ?
Y a-t-il des images qui ont mis en place `` ou quelque chose afin que vous puissiez ajouter - par exemple - un sandbox de dos d’âne supplémentaire autour de dire Firefox ?
Comment pouvez-vous courir applications GUI dans un conteneur de docker ?
Y a-t-il des images qui ont mis en place `` ou quelque chose afin que vous puissiez ajouter - par exemple - un sandbox de dos d’âne supplémentaire autour de dire Firefox ?
Vous pouvez simplement installer un serveur VNC avec firefox :)
J’ai poussé une image vnc/firefox ici :``
L’image telle qu’elle fait avec cette Dockerfile :
Vous pouvez exécuter l’image comme ceci :
``
Cela va créer un conteneur de docker avec vnc en cours d’exécution, le mot de passe``
EDIT : À partir de docker1.3, la variable HOME a changé. Cela devrait fonctionner :``
Xauthority devient un problème avec les systèmes plus récents. Je peux supprimer toute protection avec xhost + avant l'exécution de mon conteneurs docker, ou je peux la passer dans un bien préparés Xauthority fichier. Typique Xauthority fichiers sont nom d'hôte spécifique. Avec docker, chaque conteneur peut avoir un autre nom d'hôte (défini avec docker run-h), mais même en mettant le nom d'hôte du récipient identique au système hôte n'aide pas dans mon cas. xeyes (j'aime bien cet exemple) ne serait tout simplement ignorer le magic cookie et ne transmettez pas d'informations d'identification pour le serveur. Ainsi nous obtenons un message d'erreur " Pas de protocole spécifié Ne peut pas ouvrir afficher
Le Xauthority fichier peut être écrit de façon à ce que le nom d'hôte n'a pas d'importance. Nous avons besoin de définir l'Authentification de la Famille de 'FamilyWild'. Je ne suis pas sûr, si xauth a une bonne ligne de commande pour ce faire, voici donc un exemple qui combine xauth et sed pour le faire. Nous avons besoin de changer les 16 premiers bits du programme nlist de sortie. La valeur de FamilyWild est de 65535 ou 0xffff.
docker build -t xeyes - << __EOF__
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes
__EOF__
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run -ti -v $XSOCK:$XSOCK -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH xeyes
Avec docker volumes de données, il est très facile à exposer xorg du socket de domaine unix à l'intérieur du conteneur.
Par exemple, avec un Dockerfile comme ceci:
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes
Vous pouvez effectuer les opérations suivantes:
$ docker build -t xeyes - < Dockerfile
$ XSOCK=/tmp/.X11-unix/X0
$ docker run -v $XSOCK:$XSOCK xeyes
Bien sûr, cela est essentiellement le même que X-forwarding. Il accorde le conteneur plein accès à la xserver sur l'hôte, il est seulement recommandé si vous faites confiance à ce qui est à l'intérieur.
Remarque: Si vous êtes préoccupé par la sécurité, une meilleure solution serait de limiter l'application obligatoire ou basé sur les rôlesde contrôle d'accès. Docker réalise assez bonne isolation, mais il a été conçu avec un objectif différent à l'esprit. Utilisation AppArmor, SELinux, ou GrSecurity, qui ont été conçus pour répondre à votre préoccupation.
Vous pouvez également utiliser subuser : https://github.com/timthelion/subuser
Cela vous permet d’empaqueter les nombreuses applications gui dans menu fixe. Firefox et emacs ont été testés jusqu'à présent. Avec firefox, webGL ne fonctionne pas bien. Chrome ne fonctionne pas du tout.
EDIT : Œuvres sonores !
Voici une solution légère qui évite d'avoir à installer le moindre X
serveur, vnc
serveur ou sshd
démon sur le conteneur. Ce qu'il gagne en simplicité qu'il perd en sécurité et d'isolation.
Il suppose que vous vous connectez à l'ordinateur hôte à l'aide de ssh
avec X11
d'expédition.
Dans l' sshd
configuration de l'ordinateur hôte, ajoutez la ligne
X11UseLocalhost no
De sorte que l'transmis X port du serveur sur l'hôte est ouvert sur toutes les interfaces (et pas seulement lo
) et en particulier sur le Panneau interface virtuelle, docker0
.
Le conteneur, lorsqu'il est exécuté, les besoins d'accès à l' .Xauthority
le fichier de sorte qu'il peut se connecter au serveur. Pour ce faire, nous définissons un volume en lecture seule pointant vers le répertoire d'accueil de l'hôte (peut-être pas une bonne idée!) et aussi de mettre la XAUTHORITY
variable en conséquence.
docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority
Ce n'est pas assez, nous avons aussi de passer de l'AFFICHAGE de la variable à partir de l'hôte, mais en substituant le nom d'hôte par l'adresse ip:
-e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/")
Nous pouvons définir un alias:
alias dockerX11run='docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority -e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/")'
Et tester de cette façon:
dockerX11run centos xeyes
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.