Os contêineres do Docker fornecem ambientes isolados para a execução de aplicativos, garantindo consistência e portabilidade. Ao trabalhar com contêineres Docker, é fundamental ser capaz de inspecionar e se conectar aos seus shells. Com isso, você pode executar comandos, solucionar problemas e monitorar o comportamento dos contêineres em tempo real.

Este artigo explica como acessar contêineres Docker locais e remotos para manutenção e atualizações.

Por que você precisa acessar seus contêineres

O acesso aos contêineres é essencial para a eficácia do gerenciamento e da solução de problemas em ambientes conteinerizados. Ele permite que você analise os registros e as informações de tempo de execução do contêiner para identificar e resolver erros com facilidade.

O acesso aos contêineres também permite executar comandos para atualizações rápidas da configuração, instalações de pacotes e outras tarefas administrativas. Sem acesso, você teria que reconstruir toda a imagem do contêiner com a configuração atualizada, o que pode ser demorado e ineficiente.

Os contêineres também devem ser capazes de se comunicar uns com os outros em um ecossistema de aplicativos distribuídos. Portanto, você precisa de acesso ao contêiner para diagnosticar comandos e garantir que a conectividade entre os contêineres esteja saudável.

Embora seja possível acessar os contêineres por meio de um protocolo SSH (Secure Shell) tradicional, o Docker oferece vários métodos integrados para ajudá-lo a economizar tempo e aumentar a eficiência. Esses métodos incluem:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

Cada método tem seus casos de uso e vantagens específicos. Conhecer o comando certo para o seu caso de uso pode ajudar a otimizar a sua abordagem.

Como e por que usar o docker exec

O comando docker exec possibilita o acesso à sessão de shell de um contêiner já em execução, permitindo executar comandos adicionais sem a necessidade de iniciar uma nova instância. Observe que esse comando não é persistente, o que significa que ele não será executado novamente se o contêiner for desabilitado ou reiniciado.

Para acessar um contêiner em execução, você precisa do nome ou ID dele (você pode obtê-lo executando docker ps -a). Em seguida, insira no comando a seguir:

docker exec -it  /bin/bash
Acessando um contêiner com o docker exec.
Acessando um contêiner com o docker exec.

Como e por que usar o docker run

O comando docker run permite iniciar um novo contêiner e acessar imediatamente seu shell. Por padrão, esse contêiner não é anexado à sua sessão shell atual, mas você pode anexá-lo usando a opção -it.

O comando a seguir permite que você inicie um novo contêiner, anexe à sua sessão shell atual e gere um Bash shell:

docker run -it  /bin/bash
Acessando o contêiner com o docker run.
Acessando o contêiner com o docker run.

Como e por que usar o docker attach

O comando docker attach é útil para monitorar e depurar operações de contêineres. Ele permite que você se conecte a um contêiner em execução e visualize seus fluxos padrão de entrada, saída e erro em tempo real.

Para usá-lo, inicie o contêiner usando docker run. Em seguida, desconecte-se dele pressionando Ctrl+P e Ctrl+Q. Ou você pode também fornecer o sinalizador -d para esse contêiner.

Quando tiver o contêiner em execução em segundo plano, acesse-o com o seguinte comando:

docker attach 
Usando o docker attach para acessar um contêiner.
Usando o docker attach para acessar um contêiner.

Como e por que usar o Docker Compose

O Docker Compose permite criar e executar aplicativos do Docker com vários contêineres. Você pode usá-lo para definir os serviços que compõem o seu aplicativo em um arquivo YAML, e, assim, usar esse arquivo para iniciar e gerenciar todos os contêineres juntos. Ele é adequado para ambientes de desenvolvimento e teste em que você precisa ativar ambientes complexos rapidamente.

Para acessar um contêiner específico que já esteja em execução, execute o seguinte comando docker compose, seguido do nome do serviço e do comando que você deseja executar:

docker compose exec app /bin/bash

Esse comando inicia um novo processo dentro do contêiner que está executando o comando especificado. Você pode usá-lo para executar qualquer comando dentro do contêiner, inclusive shells interativos como o Bash.

Da mesma forma, se quiser iniciar um novo contêiner usando o Docker Compose e obter acesso imediato a ele, execute o seguinte comando:

docker compose run app /bin/bash

Observe que docker compose tem duas sintaxes diferentes: docker-compose (versão 1) e docker-compose (versão 2). A sintaxe da versão 2 é mais flexível e avançada, e, portanto, é recomendável que você a use sempre que possível.

Usando o Docker Compose para acessar contêineres.
Usando o Docker Compose para acessar contêineres.

Como adicionar um servidor SSH ao seu contêiner Docker

Adicionar um servidor SSH ao seu contêiner Docker ajuda você a gerenciar e solucionar problemas dos seus aplicativos conteinerizados. Um servidor SSH permite acessar e gerenciar contêineres remotamente, executar comandos e inspecionar registros de qualquer lugar.

Você pode adicionar um servidor SSH incluindo no seu Dockerfile antes de criar o contêiner e, em seguida, conectando-o com um cliente SSH. Como alternativa, você pode adicionar acesso SSH temporário gerando um shell dentro de um contêiner em execução e instalando um servidor SSH nele.

Inclua um servidor SSH ao criar seu contêiner Docker

Ao criar um contêiner Docker, incluir um servidor SSH dentro do contêiner pode ser útil se você quiser acessá-lo persistentemente via SSH. Isso permite o acesso remoto e a depuração do contêiner durante o desenvolvimento ou para solução de problemas. A inclusão de um servidor SSH dentro do contêiner também permite que você transfira arquivos com segurança de e para o contêiner.

Para incorporar um servidor SSH no momento da build, faça algumas alterações no Dockerfile do contêiner. Aqui está um exemplo de Dockerfile que inclui um servidor SSH:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]
Contêiner Docker criado com um servidor SSH.
Contêiner Docker criado com um servidor SSH.

Este código cria um contêiner com a imagem mais recente do Debian e instala o servidor SSH. Ele também cria um novo diretório para o servidor SSH, define a senha do root e habilita o login do root por meio da configuração do SSH.

Por fim, ele expõe a porta 22, a porta padrão do SSH.

Para usar esse Dockerfile, crie o contêiner usando o comando docker build, e então execute o contêiner usando docker run. Um exemplo:

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

Esse comando cria um contêiner usando o Dockerfile e o marca com o nome ssh-container. Use -d para executar o contêiner no modo desanexado. Em seguida, mapeie a porta 22 dentro do contêiner para a porta 2222 na máquina host com -p.

Quando o contêiner estiver em execução, você poderá acessá-lo pelo SSH usando o comando ssh:

ssh root@localhost-p 2222

Quando a senha for solicitada, digite a senha que você definiu no arquivo YAML. Nesse caso, ela é “root123” Agora você está conectado ao servidor SSH em execução no contêiner. Isso significa que você pode realizar depuração remota ou transferir arquivos de e para o contêiner.

Adicionar temporariamente um servidor SSH a um contêiner Docker em execução

Você também pode adicionar um servidor SSH a um contêiner em execução usando o comando docker exec:

docker exec <container_name_or_id> /bin/bash

Após obter acesso ao contêiner, instale o servidor OpenSSH e inicie o daemon SSH:

apt update && apt install openssh-server && /usr/sbin/openssh -D

Isso abre uma nova instância do servidor SSH dentro do contêiner. Agora você está pronto para se conectar a ele usando um cliente SSH em seu computador local.

Observe que você só pode se conectar ao contêiner via SSH se você ou sua equipe expôs a porta SSH durante a fase de execução, ou build.

Conecte-se ao servidor SSH do seu contêiner

Comece identificando o endereço IP ou o nome do host do contêiner a partir da sua plataforma, ou serviço de gerenciamento de contêineres.

Para se conectar ao endereço IP, use o comando ssh:

ssh [username]@[container-ip-address]

Quando solicitado, digite a senha do nome de usuário especificado. Em vez de uma senha, alguns servidores SSH podem usar segurança baseada em chave.

Agora você deverá ter uma sessão de terminal remoto conectada ao contêiner.

Resumo

À medida que o Docker se torna cada vez mais popular, é importante ser capaz de inspecionar os contêineres em execução no seu ambiente. Essa funcionalidade lhe permite diagnosticar e resolver problemas durante o desenvolvimento.

O Docker também oferece um conjunto versátil de comandos integrados para várias tarefas de desenvolvimento. Você pode usar esses comandos para otimizar seu fluxo de trabalho sem precisar depender dos métodos SSH tradicionais.

Confira a Kinsta para hospedar seus aplicativos, sites WordPress ou bancos de dados. Com a Kinsta, você tem uma hospedagem rápida e segura, com seus projetos implantados em uma infraestrutura criada na rede nível Premium do Google Cloud Platform e máquinas C2. Você pode escolher entre os 37 centros de dados e uma CDN habilitada para HTTP/3 com 260+ PoPs. Mantenha-se seguro com a tecnologia de contêineres isolados, dois fortes firewalls e proteção avançada contra DDoS com tecnologia Cloudflare. E você pode integrar aplicativos ou automatizar fluxos de trabalho com a API da Kinsta.

Marcia Ramos Kinsta

Sou o líder da equipe editorial na Kinsta. Sou um entusiasta de código aberto e adoro programar. Com mais de 7 anos de experiência em redação e edição técnica para a indústria de tecnologia, adoro colaborar com pessoas para criar conteúdos claros e concisos e melhorar fluxos de trabalho.