Como fazer ssh em um contêiner do Docker

O SSH é um dos comandos mais usados ​​na caixa de ferramentas de um administrador de sistema, mas não é comumente visto em conjunto com o Docker. Veja como você pode usar o SSH em um contêiner em execução e por que você deve pensar duas vezes antes de fazer isso.

índice

  1. Devo usar SSH com contêineres do Docker?
  2. Instalando o servidor SSH em um contêiner do Docker
    1. Configurar autenticação
    2. conexão ao recipiente
    3. Configurar atalhos de contêiner com configuração SSH
  3. Em vez disso, use o Dockssh para simplificar o gerenciamento de contêineres
  4. Resumo

Devo usar SSH com contêineres do Docker?

Colocar SSH em um contêiner do Docker geralmente é uma prática ruim que você deve evitar. É quase sempre melhor usar o comando docker exec para colocar um shell em um contêiner.

Os recém-chegados ao Docker podem ficar tentados a usar o SSH para atualizar arquivos em um contêiner. Os contêineres devem ser descartáveis, portanto, devem ser tratados como imutáveis ​​após a criação, com exceção de dados persistentes armazenados em volumes. Crie uma nova imagem e reinicie o contêiner ao editar o código-fonte.

Além do processo de configuração de várias etapas, a instalação do SSH em uma imagem do Docker adiciona vários pacotes de dependência e expõe outro possível vetor de ataque. Em um sistema com vários contêineres ativos, você executará vários processos SSH independentes e precisará lembrar a porta correta para cada contêiner.

Em vez de adicionar SSH a contêineres individuais, instale-o uma vez no host físico que executa o Docker. Use SSH para se conectar ao seu host e execute docker exec -it my-container bash para acessar os contêineres individuais.

O tempo de execução do docker exec é a abordagem preferida, ainda existem cenários em que o SSH pode ser útil. Você pode introduzi-lo como uma medida temporária para integração com sistemas de distribuição legados. Ele também pode ser usado por alguns IDEs e ferramentas de compilação para fornecer funcionalidade de recarga em tempo real durante o desenvolvimento.

Instalando o servidor SSH em um contêiner do Docker

As imagens de base do Docker mais populares são intencionalmente mantidas simples. Você mesmo precisará adicionar o servidor OpenSSH, mesmo em imagens derivadas de distribuições comuns de sistemas operacionais.

Aqui está um exemplo Dockerfile para uma imagem baseada em Debian:

 RUN apt-get update && apt-get install -y openssh-server RUN sed -i 's/PermitRootLogin proibir-senha/PermitRootLogin yes/' /etc/ssh/sshd_config ENTRYPOINT service ssh start && bash

Alterou a configuração do SSH para que você possa fazer login como root , o usuário padrão em um contêiner do Docker. Para maior segurança, configure uma conta de usuário dedicada:

 EXECUTAR useradd -m -s /bin/bash sshuser

Isso cria um novo usuário chamado sshuser com um diretório inicial -m ). A opção -s define o shell de login padrão do usuário como Bash.

O uso ENTRYPOINT garante que o serviço SSH sempre seja iniciado quando o contêiner for iniciado. A execução é então passada para o Bash como um processo em primeiro plano do contêiner. Você pode substituí-lo pelo binário do seu aplicativo.

Configurar autenticação

Em seguida, você deve configurar um sistema de autenticação. Você pode atribuir uma senha à sua conta sshuser e fazer login com isso:

 RUN echo "sshuser:Changeme" | alterar senha

Uma maneira mais segura é configurar a autenticação de chave SSH. Você precisará criar um par de chaves em seu computador cliente e copiar a parte pública para o contêiner. Dessa forma, o daemon SSH pode verificar a identidade da sua máquina quando ela se conectar.

Edite seu Dockerfile para configurar a pasta de .ssh para seu usuário. Copie para uma chave pública em seu diretório de trabalho, com um comando docker cp ou uma instrução COPY no Dockerfile . Neste último caso, a chave seria inserida na imagem, visível para qualquer pessoa com acesso.

 COPIAR id_rsa.pub /home/sshuser/.ssh/authorized_keys RUN chown -R sshuser:sshuser /home/sshuser/.ssh RUN chmod 600 /home/sshuser/.ssh/authorized_keys

Este script cria o arquivo SSH authorized_keys com a chave pública id_rsa.pub no diretório de trabalho. As permissões do sistema de arquivos são ajustadas para atender aos requisitos de SSH.

conexão ao recipiente

Agora você está pronto para se conectar ao seu contêiner. Execute o contêiner com a porta 22 associada ao host:

 docker run -p 22:22 my-image:latest

A execução do ssh [email protected] fornecerá um shell dentro do seu contêiner.

Você pode ignorar a vinculação de porta se estiver se conectando da máquina que hospeda o contêiner do Docker. Eu uso o docker inspect para obter o endereço IP do seu contêiner e, em seguida, passá-lo para o comando SSH connect.

 docker inspecionar <id-or-name> | grep 'IPAddress' | cabeça -n 1

Use o cliente SSH em sua máquina para se conectar ao contêiner:

 ssh [email protegido] # OU ssh [email protegido]

Você precisará usar uma porta alternativa se estiver executando um servidor SSH separado no host ou se tiver vários contêineres que precisam da porta 22. Veja como iniciar uma conexão quando o SSH estiver vinculado à porta 2220:

 docker run -p 22:2220 my-image:latest ssh [email protected] -p 2220

Configurar atalhos de contêiner com configuração SSH

Você pode manipular seu arquivo de configuração SSH para simplificar as conexões com contêineres individuais. Modifique ~/.ssh/config para definir hosts abreviados com portas pré-configuradas:

 Host my-container HostName 172.17.0.1 Porta 2220 Usuário sshuser

Agora você pode executar ssh my-container para soltar diretamente em seu contêiner. Isso torna mais fácil fazer malabarismos com várias conexões sem lembrar os endereços IP e as portas do contêiner.

Em vez disso, use o Dockssh para simplificar o gerenciamento de contêineres

O projeto Dockssh vai um passo além, fornecendo outro daemon que permite executar ssh [email protected] , sem qualquer configuração SSH manual. Não é necessário instalar um servidor SSH nos containers; O Dockssh encaminha automaticamente as conexões SSH e executa o comando docker exec .

Você deve primeiro instalar o Redis para armazenar os dados de configuração do Dockssh:

 sudo apt instalar redis

Em seguida, defina os contêineres que deseja expor adicionando um registro Redis com o nome do contêiner e uma senha para conexões SSH:

 redis-cli set dockssh:my-container:pass "container-password-here"

Então baixe o Dockssh:

 sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh sudo chmod +x /usr/local/bin/dockssh sudo ufw allow 22022 # Inicie o servidor DockSSH dockssh

Agora você pode se conectar ao seu contêiner:

 ssh [e-mail protegido] -p 22022

O Dockssh está escutando na porta 22022 por padrão. O firewall é aberto para permitir conexões de entrada usando a porta.

Você será solicitado a fornecer a senha do contêiner ao se conectar. Isso foi definido como container-password-here em nosso log Redis anterior.

O uso do Dockssh simplifica o SSH em um grande número de contêineres do Docker. Essa abordagem é ideal quando você se conecta regularmente a seus contêineres a partir de um host remoto, pois simplifica a sequência de duas etapas "SSH e depois docker exec " em um comando memorável.

Registre o Dockssh como um serviço do sistema para uso a longo prazo:

 sudo nano /etc/systemd/system/dockssh.service
 [Unit] Description=Serviço Docksh After=network.target [Service] type=simples Restart=sempre RestartSec=1 User=root ExecStart=/usr/local/bin/dockssh [Install] WantedBy=multi-user.target

Habilite o serviço usando systemctl :

 sudo systemctl habilita dockssh.service sudo systemctl start dockssh

O Dockssh agora será iniciado automaticamente na inicialização do sistema.

Resumo

A combinação de SSH com contêineres do Docker geralmente é considerada um antipadrão, mas ainda tem seus usos em ambientes de desenvolvimento, teste e legados. Quando não houver alternativa, você pode adicionar o servidor SSH ao seu contêiner, copiar uma chave pública e conectar-se por meio do IP do contêiner ou da ligação da porta do host.

Os administradores de sistema que desejam gerenciar remotamente um grande número de contêineres do Docker podem experimentar o Dockssh. Ele permite que você se familiarize com os comandos ssh por meio de um mapeamento contínuo nos bastidores para o docker exec , oferecendo o melhor dos dois mundos usando imagens brutas.

  • Como alternar entre os canais Dev e Beta no Windows 11
  • Como corrigir "Este site usa uma quantidade significativa de memória" em um Mac

descubra mais conteúdo

O que é um amplificador integrado?

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão geek

Deixe uma resposta Cancelar resposta

Posso fazer SSH em um contêiner do Docker?

O método SSH também funciona bem para contêineres do Docker. Dito isso, você pode usar o SSH em um contêiner do Docker usando o docker exec interno do Docker . Se você não precisar de um shell interativo, também poderá usar o comando docker attach para conectar o stdin e o stdout do host ao contêiner em execução e executar comandos remotos.

Como faço para acessar o contêiner do Docker remotamente?

Como se conectar ao Remote Docker usando a CLI de contexto do docker

  1. Pré-requisito:
  2. Listando os valores de contexto atuais.
  3. Execute um novo contêiner do Docker no nó 2.
  4. Liste o recipiente.
  5. Configurando a variável de ambiente.
  6. Verifique se você configurou a variável.
  7. Configure o SSH para confiar no host.
  8. Conectando-se a nós com DOCKER_HOST.

Como conecto o terminal ao contêiner do Docker?

Existe um comando docker exec que pode ser usado para se conectar a um contêiner que já está em execução.

  1. Use docker ps para obter o nome do contêiner existente.
  2. Use o comando docker exec -it <container name> /bin/bash para obter um shell bash no contêiner.

Como faço login no contêiner do Docker?

Acessando os contêineres do Docker

  1. Obtenha o ID do contêiner executando o seguinte comando: docker ps. Uma saída semelhante à seguinte é retornada: CONTAINER ID IMAGE NAMES …….. …….
  2. Acesse o contêiner do Docker executando o seguinte comando: docker exec -it <container_id> /bin/bash. Onde container_id.
Ir arriba