¿Puedes ejecutar aplicaciones GUI en un contenedor Docker de Linux?
¿ Cómo se pueden ejecutar aplicaciones GUI en un contenedor Docker de Linux?
¿Hay alguna imagen que se configure vncserver
o algo así para que puedas, por ejemplo, agregar una zona de pruebas de aceleración adicional en, por ejemplo, Firefox?
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
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
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