Eu tenho uma instância do Amazon EC2 executando o CentOS 7 com o docker instalado. Estou executando contêineres de docker em uma rede de docker personalizada.
Estou tentando acessar uma interface da web de um desses contêineres de janela de encaixe. O comando a seguir 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 apenas tentar a solução simples e fizer
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 $my_ip
.
Este artigo me trouxe mais https://dzone.com/articles/docker-x11-client-via-ssh ao explicar que, quando você usa o encaminhamento X11 com ssh, o ssh está realmente iniciando um 'proxy' na máquina remota que escuta a 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 este dockerfile:
FROM centos
RUN yum install -y firefox dbus && \
dbus-uuidgen > /var/lib/dbus/machine-id
ENTRYPOINT [ "/usr/bin/firefox" ]
e este comando docker run após a execução ssh -Y remote-host
:
docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox
Yay! Mas não exatamente. Se eu mudar de --network host
para --network myNetwork
ele não funcionará mais. Porque, como mencionado acima, o ssh está escutando na interface de loopback da máquina host, à qual o contêiner do docker não tem mais acesso.
Portanto, parece que a única maneira de fazer isso funcionar é se eu descobrir uma maneira de dizer ao ssh para se ligar a uma interface diferente de loopback ao configurar o encaminhamento do X11. Isso é possível?
fonte
GatewayPorts
se sim no lado do servidor,sshd_config
se isso funcionaria?Respostas:
Eu descobri outra maneira de realizar meu objetivo final de acessar a interface da web da web de um dos contêineres do docker. Acabei configurando 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. Não sou responsável pelas implicações de segurança da execução do sshd como root em um contêiner de docker. Certifique-se de entender as consequências de fazer isso.
Os passos que segui estão listados abaixo. Para este exemplo, considere
centosec2
é meu servidor EC2 executando o CentOS,myappcontainer
o nome do contêiner executando o aplicativo que hospeda a interface da Web que estou tentando acessar emy-net
é o nome da rede de sobreposiçãomyappcontainer
em execução.Requisitos:
sshd
. Eu usei https://hub.docker.com/r/macropin/sshd/Passos:
Porta encaminha uma porta do seu laptop para o servidor. Neste exemplo, 8888 será a porta executando o proxy SOCKS da perspectiva do seu laptop e 9696 será a porta encaminhada no servidor.
[user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N
Em outro shell, abra uma sessão ssh regular no servidor e inicie o
sshd
contêiner. Verifique se osshd
contêiner está sendo executado na mesma rede que o contêiner que está executando a interface da web.Depois que o
sshd
contêiner iniciar, use o mesmo shell para ssh nosshd
contêiner e inicie um proxy SOCKS na porta que está sendo encaminhada para o seu laptop.-D 9696
diz ao ssh para iniciar um servidor SOCKS na porta 9696.[user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N
Agora, seu laptop pode acessar a rede do docker através do proxy SOCKS em execução na porta 8888. Configure o navegador de sua escolha para conectar-se à Internet através de um proxy SOCKS v5 em execução
localhost:8888
. Em seguida, você poderá navegar para a interface da web usando o nome do host do contêiner do dockerhttp://myappcontainer:8080
É um monte de coisas complicadas, mas foi a maneira mais fácil de descobrir como fazer isso. Espero que isso ajude outra pessoa.
fonte