Acessar a IU da Web em execução no contêiner do docker em execução no host remoto

0

Eu tenho uma instância do Amazon EC2 executando o CentOS 7 com o Docker instalado. Estou executando contêineres de estivadores em uma rede de encaixe personalizada.

Estou tentando acessar uma interface do usuário da web de um desses contêineres docker. O seguinte comando funciona quando tento fazer isso no meu mac:

xhost + $my_ip
docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox

No entanto, se eu tentar a solução simples e fazer

ssh -Y remote-host docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox

Não funciona; provavelmente porque remote-host não tem acesso a $my_ip .

Este artigo me ajudou ainda mais no link explicando que quando você usa o encaminhamento do X11 com o ssh, O ssh está realmente iniciando um 'proxy' na máquina remota que ouve na interface de loopback da máquina remota.

Para que eu possa executar o Firefox de dentro de um contêiner em um host remoto usando esse dockerfile:

FROM centos
RUN yum install -y firefox dbus && \
    dbus-uuidgen > /var/lib/dbus/machine-id

ENTRYPOINT [ "/usr/bin/firefox" ]

e este comando de execução do docker depois de executar ssh -Y remote-host :

docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox

Yay! Mas não é bem assim. Se eu mudar de --network host para --network myNetwork , isso não funcionará mais. Porque, como dito acima, o ssh está escutando na interface de loopback da máquina host, à qual o contêiner docker não tem mais acesso.

Então parece que a única maneira de fazer isso funcionar é se eu descobrir uma maneira de dizer ao ssh para ligar a uma interface diferente do loopback ao configurar o encaminhamento do X11. Isso é possível?

    
por FGreg 21.04.2017 / 01:40

1 resposta

1

Eu descobri outra maneira de atingir meu objetivo final de acessar a interface do usuário da web de um dos contêineres do Docker. Acabei de configurar um proxy SOCKS v5 sobre SSH. Isso é realmente destinado apenas para fins de desenvolvimento e depuração e não deve ser usado em uma situação de produção. Eu não me responsabilizo pelas implicações de segurança da execução do sshd como root em um contêiner docker. Certifique-se de entender as conseqüências disso.

Os passos que eu dei estão listados abaixo. Para este exemplo, considere centosec2 é o meu servidor EC2 executando o CentOS, myappcontainer é o nome do contêiner que está executando o aplicativo que hospeda a interface da web que estou tentando acessar e my-net é o nome da rede de sobreposição que myappcontainer está sendo executado.

Requisitos:

  • Navegador que pode ser configurado para se conectar por meio de um proxy SOCKS v5. Eu sugiro o Firefox com o Add-On FoxyProxy porque ele facilita e desativa o proxy.
  • Imagem do Docker que pode executar sshd . Eu usei o link

Etapas:

  1. Porta encaminhar uma porta do seu laptop para o servidor. Neste exemplo, a 8888 será a porta que executa o proxy SOCKS do ponto de vista do seu laptop e 9696 será a porta encaminhada no servidor.

    [user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N

  2. Em outro shell, abra uma sessão ssh regular no servidor e inicie o contêiner sshd . Certifique-se de que o contêiner sshd esteja em execução na mesma rede que o contêiner que está executando a interface do usuário da web.

    [user@laptop ~]$ ssh centosec2
    [user@centosec2 ~]$ docker run --rm -d -p 2222:22 --network my-net -v .ssh/id_rsa.pub:/root/.ssh/authorized_keys macropin/sshd
    
  3. Quando o contêiner sshd for iniciado, use o mesmo shell para ssh no contêiner sshd e inicie um proxy SOCKS na porta que está sendo encaminhada para seu laptop. -D 9696 informa ao ssh para iniciar um servidor SOCKS na porta 9696.

    [user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N

  4. Agora, o seu laptop pode acessar a rede do docker através do proxy SOCKS em execução na porta 8888. Configure o navegador de sua preferência para se conectar à Internet por meio de um proxy SOCKS v5 em execução em localhost:8888 . Em seguida, você poderá navegar para a interface da Web usando o nome do host do contêiner do docker http://myappcontainer:8080

É um monte de arcos para saltar, mas foi a maneira mais fácil que eu poderia descobrir como conseguir isso. Espero que isso ajude alguém a sair.

    
por 11.09.2017 / 23:01