Não é possível iniciar a sessão do Java GUI X11 a partir do contêiner docker

3

Estou tendo problemas para executar um aplicativo Java GUI de dentro de um contêiner docker para que ele apareça na minha área de trabalho, como o xeyes faz.
Aqui estão os passos que estou tomando:

Estou conectado à minha máquina física em uma sessão do Unity e abro um terminal, executando os comandos:

root@prod:~# echo $DISPLAY 
:0
root@prod:~# ls /tmp/.X11-unix/
X0  X1024

Eu entro em uma VPN e SSH em um host (chamado host-a ).
Eu posso rodar xeyes dentro do host-a e os olhos aparecem no Unity, siga meu mouse, então o forwarding do X funciona.

a@host-a$ echo $DISPLAY
localhost:10.0
a@host-a$ sudo netstat -anutp | grep 60
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      21988/6         
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      22182/14        
tcp6       0      0 ::1:6010                :::*                    LISTEN      21988/6         
tcp6       0      0 ::1:6011                :::*                    LISTEN      22182/14

No host-a , eu uso o docker para executar a imagem que contém o aplicativo Java:

a@host-a$ sudo docker run --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -ti repo/image bash'

A saída é:

root@7722f3167495:/# echo $DISPLAY
localhost:11.0

Em seguida, tente executar o aplicativo Java:

java.awt.AWTError: Can't connect to X11 window server using 'localhost:11.0' as the value of the DISPLAY variable.

Eu já tentei definir DISPLAY como 10.0 , mas igual.
Eu notei que somente a máquina local prod contém os soquetes em /tmp/.x11-unix . O container e host-a não.

Qualquer sugestão sobre por que a sessão X não foi estabelecida seria muito apreciada.

    
por user1330734 11.02.2017 / 08:47

1 resposta

2

Não é provável que seja possível desta forma

O arquivo de soquete X11 é somente para conexão local e só estará acessível em sua estação de trabalho. Daí o seu TCP.

Como você usou o SSH com X11Forwarding para SSH no seu servidor host-a, ele criou uma conexão tcp entre sua estação de trabalho e o servidor. Esta é a tela TCP X11 'localhost: 10' quando você está no seu servidor. E o cliente SSH em sua estação de trabalho encaminhará o tráfego de lá para o seu arquivo de soquete .X11 unix. Não tenho certeza de onde a exibição localhost: 11 está vindo, mas também está relacionada ao encaminhamento SSH. Você fez apenas um salto SSH, ou dois?

Você pode ter mais sucesso, se você ativar a escuta TCP diretamente no servidor X da sua estação de trabalho (remover '-nolisten tcp' sinalizadores e talvez precise adicionar '-listen tcp') e informar ao contêiner docker para usar sua exibição da estação de trabalho diretamente

docker run .... -e DISPLAY=<workstation-ip-address>:0

No entanto, você também provavelmente terá erros de 'xauth'

Você poderia usar o comando xauth para exportar um token de autenticação para seu diretório pessoal no servidor e montá-lo como um volume docker para fornecer ao contêiner acesso ao token e também definir a variável de ambiente XAUTHORITY no comando docker , para esse arquivo xauth exportado, ou então use xauth dentro do contêiner para importar o token.

Eu tenho um velho contêiner de amostra do docker em algum lugar no gitbub que faz isso para executar o Azureus. Vou ver se consigo encontrar o link

Às vezes é muito mais fácil adicionar um servidor VNC ao contêiner, iniciar seu aplicativo Java em uma sessão vnc no contêiner e usar o vnc para se conectar a ele a partir da estação de trabalho.

ou no host do docker, é possível executar um servidor vnc e usar o docker '-net host' para compartilhar a pilha de rede do host e usar DISPLAY =: 5900 no contêiner e conectar-se ao host de exibição VNC-a: 0 da sua estação de trabalho. Isso fica por aí precisando adicionar pacotes VNC ao seu container

    
por 12.02.2017 / 03:44