Como acessar docker em outra máquina – Docker context

Essa semana descobri uma dica muito boa do Docker, que é o docker context.
Eu estou usando um notebook reserva como se fosse um mini servidor aqui, para ter bancos de dados separados, alguns sistemas como Geoserver, e também brincar um pouco de fazer deploy, e lógico que nessa brincadeira toda eu instalei Docker para poder faciltar as coisas.
A princípio eu usava o seguinte fluxo:
Acessava o “servidor” via SSH e através dele eu manipulava o docker dentro do servidor,.
Mas aí me veio a curiosidade “Seria possível o cliente docker, instalado no meu notebook acessar o docker no servidor” e a resposta é “Sim senhor!”.
Mandei o questionamento no grupo grupo do docker no telegram e um colega ajudou apontando algumas soluções, onde uma delas (a única que testei e que achei bem interessante) foi a de criar um contexto no docker que indicasse em qual máquina o meu cliente precisa conectar para trabalhar.
Essa conexão seria feita via SSH, mas o próprio cliente docker se encarregaria de fazer a conexão, e o melhor é que, os atalhos e funções que eu criei no meu terminal para usar no docker funcionam perfeitamente, sem precisar criar os mesmos no servidor.
Criando um contexto novo no Docker.
Quando instalamos o cliente docker na máquina, ele já cria um contexto padrão para acessar o swarm da própria maquina, e esse contexto é chamado de default
, e podemos listar todos os contextos com o seguinte comando:
docker context list

O contexto ativo é o que possui o asterisco nele (*).
Criando um novo contexto.
De acordo com o Docker context, um CLI pode ter vários contextos para trabalhar, e cada contexto contém as informações de endpoints e segurança que são necessários para seja feita a mudança entre eles.
Então para criar um novo contexto, nesse caso, eu precisei de indicar o endereço ssh que o docker vai utilizar para gerenciar os containers, usando o seguinte comando:
docker context create <nome-do-contexto> --docker "host=ssh://<usuario>@<ip>"
Sendo:
<nome-do-contexto> o nome que o novo contexto vai receber;
<usuario>: O usuário a ser utilizado na conexão SSH;
<ip>: O endereço IP da máquina a ser acessada;
E ao listar os contextos, o novo irá aparecer.

Trocando contextos
Para mudar entre os contextos é muito fácil, basta rodar o seguinte comando:
docker context use <nome-do-contexto>

O contexto ativo é o que está com o asterisco nele.
Mas pode ser que nesse momento uma mensagem de erro ocorra dizendo que não foi possível autenticar via SSH no servidor, isso ocorre pelo motivo de precisar de uma senha ou de uma chave SSH que permita fazer essa conexão entre as máquinas.
Então, uma solução que achei foi gerar uma chave SSH no meu notebook e enviar a chave pública para o servidor usando o ssh-copy-id.
Autenticando via SSH
Para que não fosse preciso mais ficar autenticando sempre, eu gerei uma chave nova na máquina própria para acessar esse servidor usando o ssh-keygen
.
Em seguida fiz a cópia para o servidor, e foi a única vez que precisei digitar senha para acessar:
ssh-copy-id -i <caminho-da-chave-ssh> <usuario>@<ip>
Após a copia, bastou testar se a conexão ssh estava ok entre as máquinas:
ssh -i <caminho-da-chave> <usuario>@<ip>
E assim assim a conexão é feita com sucesso, apartir desse momento, sempre que fizer uma mudança de contexto para o servidor a conexão é feita automagicamente e podemos trabalhar nossos containers normalmente no servidor.

Na imagem acima, é possível observar que o comando lscd
, que é uma função que criei no meu termina para listar os containers de uma forma mais simples, funciona perfeitamente mesmo estando só na minha máquina, e não no servidor.
Observações finais.
Isso foi algo bem simples, pois estou trabalhando na minha rede aqui de casa, então vale a pena estudar um pouco mais sobre as melhores prática de uso do SSH e das chaves.
Facilitou bastante usar o cliente dessa forma, e já estou pensando em criar um atalho no meu terminal para fazer a mudança de contextos.
Quero agradecer ao Francílio que me deu a dica do tutorial de uso do context no grupo do telegram, já eram quase 22hs e ele ajudou bem rapidinho. E uma dica que ele deu foi “nunca adicionar tcp://0.0.0.0:2375 nas opções do daemon”, eu ainda não sei quais são as complicações que isso pode trazer, mas assim que eu descobrir, certamente vai virar um artigo aqui no blog.
Relacionado a docker, tem esse artigo sobre como usar VSCode em containers Docker que pode ajudar nos estudos e desenvolvimento.
Caso tenha interesse em cursos de programação aqui nesse link tem ótimas indicações de cursos (inclusive sobre docker) em preços acessível, comprando pelo link vai ajudar a manter a produção de conteúdos para os canais que participo.
Fontes
Documentação do docker context (clique aqui).