¿Puedes ejecutar aplicaciones GUI en un contenedor Docker de Linux?

Resuelto Will asked hace 11 años • 24 respuestas

¿ Cómo se pueden ejecutar aplicaciones GUI en un contenedor Docker de Linux?

¿Hay alguna imagen que se configure vncservero algo así para que puedas, por ejemplo, agregar una zona de pruebas de aceleración adicional en, por ejemplo, Firefox?

Will avatar Apr 30 '13 16:04 Will
Aceptado

Simplemente puedes instalar un servidor vnc junto con Firefox :)

Envié una imagen, vnc/firefox, aquí: docker pull creack/firefox-vnc

La imagen ha sido realizada con este Dockerfile:

# Firefox over VNC
#
# VERSION               0.1
# DOCKER-VERSION        0.2

FROM    ubuntu:14.04
# Make sure the package repository is up to date
RUN     apt-get update

# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN     apt-get install -y x11vnc xvfb firefox
RUN     mkdir ~/.vnc
# Setup a password
RUN     x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way to do it, but it does the trick)
RUN     bash -c 'echo "firefox" >> /.bashrc'

Esto creará un contenedor Docker que ejecuta VNC con la contraseña 1234:

Para Docker versión 18 o posterior:

docker run -p 5900:5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

Para Docker versión 1.3 o posterior:

docker run -p 5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

Para Docker anterior a la versión 1.3:

docker run -p 5900 creack/firefox-vnc x11vnc -forever -usepw -create
creack avatar May 01 '2013 00:05 creack

Xauthority se convierte en un problema con los sistemas más nuevos. Puedo descartar cualquier protección con xhost + antes de ejecutar mis contenedores acoplables, o puedo pasar un archivo Xauthority bien preparado. Los archivos típicos de Xauthority son específicos del nombre de host. Con Docker, cada contenedor puede tener un nombre de host diferente (establecido con docker run -h), pero incluso configurar el nombre de host del contenedor idéntico al del sistema host no ayudó en mi caso. xeyes (me gusta este ejemplo) simplemente ignoraría la cookie mágica y no pasaría credenciales al servidor. Por lo tanto, aparece el mensaje de error "No se ha especificado ningún protocolo. No se puede abrir la pantalla".

El archivo Xauthority se puede escribir de manera que el nombre de host no importe. Necesitamos configurar la Familia de autenticación en 'FamilyWild'. No estoy seguro de si xauth tiene una línea de comando adecuada para esto, así que aquí hay un ejemplo que combina xauth y sed para hacer eso. Necesitamos cambiar los primeros 16 bits de la salida de nlist. El valor de FamilyWild es 65535 o 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
Jürgen Weigert avatar Aug 13 '2014 07:08 Jürgen Weigert

Acabo de encontrar esta entrada de blog y quiero compartirla aquí con ustedes porque creo que es la mejor manera de hacerlo y es muy fácil.

http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

PROS:
+ no hay elementos del servidor x en el contenedor acoplable
+ no se necesita cliente/servidor vnc
+ no ssh con reenvío x
+ contenedores acoplables mucho más pequeños

CONTRAS:
- usar x en el host (no diseñado para entornos aislados seguros)

En caso de que el enlace falle algún día, he puesto la parte más importante aquí:
dockerfile:

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

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

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

construir la imagen:

docker build -t firefox .

y el comando ejecutar:

docker run -ti --rm \
   -e DISPLAY=$DISPLAY \
   -v /tmp/.X11-unix:/tmp/.X11-unix \
   firefox

por supuesto, también puedes hacer esto en el comando ejecutar consh -c "echo script-here"

SUGERENCIA: para ver el audio, consulte: https://stackoverflow.com/a/28985715/2835523

A. Binzxxxxxx avatar Mar 10 '2015 18:03 A. Binzxxxxxx