Como executar aplicativos GUI em um contêiner Docker

O Docker é normalmente usado para armazenar aplicativos de segundo plano e programas CLI. Você também pode usá-lo para executar programas gráficos! Você pode usar um servidor X existente, onde a máquina host já está executando um ambiente gráfico, ou você pode executar um servidor VNC dentro do contêiner.
Primeiro, é importante entender o que o Docker realmente faz. Um Docker “ container ” é uma forma de encapsulamento que parece superficialmente semelhante a uma máquina virtual. Ao contrário de uma máquina virtual, os contêineres compartilham o mesmo kernel do Linux que seu sistema host.
O próximo componente é o X Window System. Os servidores X, como o Xorg, fornecem os recursos gráficos fundamentais dos sistemas Unix. Os aplicativos GUI não podem ser renderizados sem um servidor X disponível. (Sistemas alternativos de janelas, como o Wayland, estão disponíveis – estamos nos concentrando no X neste artigo.)
Tentar executar um servidor X no Docker é teoricamente possível, mas raramente usado. Você precisaria executar o Docker no modo privilegiado (--privileged) para que ele pudesse acessar o hardware do seu host. Iniciar o servidor tentaria reivindicar seus dispositivos de vídeo, geralmente resultando em perda de saída de vídeo, já que o servidor X original do seu host tem seus dispositivos arrancados.
Uma abordagem melhor é montar o soquete do servidor X do seu host no contêiner do Docker. Isso permite que seu contêiner use o servidor X que você já possui. Os aplicativos GUI em execução no contêiner apareceriam em sua área de trabalho existente.
Por que executar aplicativos GUI no Docker?
Executar um programa GUI no Docker pode ser uma técnica útil ao avaliar um novo software. Você pode instalar o software em um contêiner limpo, em vez de poluir seu host com novos pacotes.
Essa abordagem também ajuda a evitar quaisquer incompatibilidades com outros pacotes em seu ambiente. Se precisar executar temporariamente duas versões de um programa, você pode usar o Docker para evitar ter que remover e reinstalar o software em seu host.
Encaminhando um soquete X para um contêiner Docker
Fornecer um contêiner do Docker com acesso ao soquete X do seu host é um procedimento simples. O soquete X pode ser encontrado em /tmp/.X11-unix em seu host. O conteúdo desse diretório deve ser montado em um volume do Docker atribuído ao contêiner. Você precisará usar o modo de rede do host para que isso funcione.
Você também deve fornecer ao contêiner uma variável de ambiente DISPLAY. Isso instrui os clientes X – seus programas gráficos – ao qual servidor X se conectar. Defina DISPLAY no contêiner com o valor $ DISPLAY em seu host.
Você pode encapsular toda essa configuração em um arquivo docker-compose. yml:
versão: "3" serviços: app: image: my-app: última compilação:. ambiente: - DISPLAY = $ volumes: - /tmp/.X11-unix:/tmp/.X11-unix network_mode: host
Em seguida, você precisa criar um Dockerfile para o seu aplicativo. Aqui está um exemplo que executa o navegador Firefox:
DO ubuntu: RUN mais recente apt-get update & & apt-get install -y firefox CMD ["/ usr / bin / firefox"]
Agora, construa e execute a imagem:
docker-compose build docker-compose up
Uma nova janela do Firefox deve aparecer na sua área de trabalho! A instância do Firefox será executada dentro do contêiner, independentemente de qualquer outra janela aberta do Firefox. O contêiner compartilhará o soquete X do seu host, então o Firefox em contêiner ainda aparecerá na sua área de trabalho.
Essa abordagem só deve ser usada quando você confia em seu contêiner do Docker. Expor o servidor de exibição do host é um risco à segurança se você não tiver certeza do que está dentro do contêiner.
Lidando com a autenticação X
Você pode precisar autenticar o contêiner para acessar o X Server. Primeiro, obtenha um token de autenticação X de sua máquina host. Execute xauth list e anote um dos cookies listados. Você precisará copiar a linha inteira.

Dentro do contêiner do Docker, instale o pacote xauth. Em seguida, execute xauth add, passando o token que você copiou na etapa anterior.
apt install -y xauth xauth add < token >
Seu contêiner agora deve ser autenticado com êxito no servidor X.
Outra abordagem – Executando um servidor VNC
Se você não conseguir usar o encaminhamento de soquete X, poderá configurar um servidor VNC dentro do seu contêiner. Essa abordagem permite visualizar aplicativos gráficos no contêiner, conectando-se a partir de um cliente VNC em execução no host.
Adicione o software do servidor VNC ao seu contêiner:
DO ubuntu: última atualização do apt-get RUN & & apt-get install -y firefox x11vnc xvfb RUN echo "exec firefox" > ~ / . xinitrc & & chmod + x ~ / . xinitrc CMD ["v11vnc", "-criar", "-para sempre"]
Ao executar este contêiner, um servidor VNC será criado automaticamente. Você deve vincular uma porta de host à porta 5900 – do contêiner &’ s esta é a porta em que o servidor VNC será exposto.
O Firefox é iniciado na inicialização à medida que é adicionado a . xinitrc. Este arquivo será executado quando o servidor VNC iniciar e inicializar uma nova tela.
Para se conectar ao servidor, você &’ precisará de um cliente VNC em seu host. Encontre o endereço IP do seu contêiner executando docker ps, anotando o ID do contêiner e passando-o para docker inspect < container & gt ;. Você encontrará o endereço IP próximo à parte inferior da saída, no nó da rede.

Use o endereço IP do contêiner com seu cliente VNC. Conecte-se na porta 5900 sem autenticação. Agora você deve ser capaz de interagir com os programas gráficos em execução no seu contêiner do Docker.
Conclusão
Você pode escolher entre duas abordagens ao executar programas gráficos em um ambiente em contêiner. Para uso geral, compartilhar o soquete X do host geralmente fornece a solução mais simples. Você também pode optar por executar um servidor VNC dentro do contêiner. Essa abordagem pode ser mais segura quando você não criou a imagem do contêiner.
Os aplicativos gráficos em contêiner são úteis quando você está avaliando um software ou precisa executar duas versões de um pacote. Você pode usar programas em sua área de trabalho existente sem precisar alterar a configuração do host.
Nenhum comentário