Docker se utiliza normalmente para contener aplicaciones en segundo plano y programas CLI. ¡También puede usarlo para ejecutar programas de gráficos! Puede usar un servidor X existente, donde la máquina host ya está ejecutando un entorno gráfico, o puede ejecutar un servidor VNC dentro del contenedor.
Primero, es importante comprender lo que realmente hace Docker. Un "contenedor" de Docker es una forma de encapsulación que parece ser superficialmente similar a una máquina virtual. A diferencia de una máquina virtual, los contenedores comparten el mismo kernel de Linux que su sistema host.
El siguiente componente es el sistema X Window. Los servidores X como Xorg proporcionan las capacidades gráficas fundamentales de los sistemas Unix. Las aplicaciones GUI no se pueden renderizar sin un servidor X disponible. (Hay disponibles sistemas de ventanas alternativos, como Wayland, nos centraremos en X en este artículo).
Intentar ejecutar un servidor X en Docker es teóricamente posible, pero rara vez se usa. Debería ejecutar Docker en modo privilegiado (--privileged
) para que pueda acceder al hardware de su host. Iniciar el servidor intentaría reclamar sus dispositivos de video, lo que generalmente resulta en una pérdida de salida de video ya que el servidor X original de su host se quita de sus dispositivos.
Un mejor enfoque es montar el socket del servidor X de su host en el contenedor Docker. Esto permite que su contenedor use el servidor X que ya tiene. Las aplicaciones GUI que se ejecutan en el contenedor aparecerán en el escritorio existente.
¿Por qué ejecutar aplicaciones GUI en Docker?
Ejecutar un programa de GUI en Docker puede ser una técnica útil al evaluar un nuevo software. Puede instalar el software en un contenedor limpio, en lugar de tener que contaminar su host con nuevos paquetes.
Este enfoque también le ayuda a evitar incompatibilidades con otros paquetes de su entorno. Si necesita ejecutar temporalmente dos versiones de un programa, puede usar Docker para evitar tener que quitar y reinstalar software en su host.
Reenvío de un socket X a un contenedor Docker
Dar acceso a un contenedor Docker al socket X de su host es un proceso simple. El zócalo X se puede encontrar en /tmp/.X11-unix
en su anfitrión. El contenido de este directorio debe montarse en un volumen de Docker asignado al contenedor. Necesitará utilizar el host
modo de red para que funcione.
También debe proporcionar al contenedor un archivo DISPLAY
Variable ambiental. Esto le dice a los clientes X, sus programas gráficos, a qué servidor X conectarse. Ajustado a DISPLAY
en el contenedor por el valor de $DISPLAY
en su anfitrión.
Puede empaquetar toda esta configuración en una docker-compose.yml
expediente:
version: "3"
services:
app:
image: my-app:latest
build: .
environment:
- DISPLAY=${DISPLAY}
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
network_mode: host
A continuación, debe crear un archivo Dockerfile
para su aplicación. A continuación, se muestra un ejemplo que ejecuta el navegador web Firefox:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y firefox
CMD ["/usr/bin/firefox"]
Ahora crea y ejecuta la imagen:
docker-compose build
docker-compose up
¡Debería aparecer una nueva ventana de Firefox en el escritorio! La instancia de Firefox se ejecutará dentro del contenedor, independientemente de cualquier otra ventana de Firefox abierta. El contenedor compartirá el socket X de su host, por lo que Firefox en contenedor seguirá apareciendo en el escritorio.
Este enfoque solo debe usarse cuando confía en su contenedor Docker. Exponer el servidor de visualización del host es un riesgo de seguridad si no está completamente seguro de lo que hay dentro del contenedor.
Gestión de autenticación X
Es posible que sea necesario autenticar el contenedor para acceder al servidor X. Primero obtenga un token de autenticación X de su máquina host. Correr xauth list
y anote una de las cookies enumeradas. Deberá copiar toda la línea.
Dentro del contenedor Docker, instale el xauth
paquete. Entonces corre xauth add
, pasando el token que copiaste en el paso anterior.
apt install -y xauth
xauth add <token>
Su contenedor ahora debería autenticarse con éxito en el servidor X.
Otro enfoque: ejecutar un servidor VNC
Si no puede utilizar el reenvío de sockets X, puede configurar un servidor VNC dentro de su contenedor. Este enfoque le permite ver aplicaciones de gráficos en el contenedor al conectarse desde un cliente VNC que se ejecuta en el host.
Agregue el software del servidor VNC a su contenedor:
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"]
Cuando ejecute este contenedor, se creará un servidor VNC automáticamente. Se debe asociar un puerto de host con el puerto del contenedor 5900; este es el puerto en el que se expondrá el servidor VNC.
Firefox se inicia en el inicio cuando se agrega a .xinitrc
. Este archivo se ejecutará cuando el servidor VNC se inicie e inicialice una nueva pantalla.
Para conectarse al servidor, necesitará un cliente VNC en su host. Encuentre la dirección IP de su contenedor ejecutando docker ps
, anotando el ID del contenedor y pasándolo a docker inspect <container>
. Encontrará la dirección IP en la parte inferior de la salida, dentro del archivo. Network
nodo.
Utilice la dirección IP del contenedor con su cliente VNC. Conexión en el puerto 5900 sin autenticación. Ahora debería poder interactuar con los programas gráficos que se ejecutan en su contenedor Docker.
Conclusión
Puede elegir entre dos enfoques al ejecutar programas gráficos dentro de un entorno en contenedores. Para uso general, compartir el conector X del host suele proporcionar la solución más sencilla. También puede optar por ejecutar un servidor VNC dentro del contenedor. Este enfoque puede ser más seguro si no ha creado la imagen del contenedor.
Las aplicaciones de gráficos en contenedores son útiles cuando se evalúa software o se necesita ejecutar dos versiones de un paquete. Puede utilizar programas en su escritorio existente sin tener que tocar la configuración de su host.
Descubre más contenido