Acessando contêineres com Exec

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a entrar em um contêiner Docker em execução. Essa é uma habilidade essencial de depuração, pois, embora os contêineres tenham sido projetados para serem descartáveis, muitas vezes ainda é necessário inspecionar um ambiente ativo para entender o que está acontecendo.

Para inspecionar arquivos, verificar processos em execução ou investigar problemas dentro de um contêiner, geralmente você precisa de um shell de comandos dentro do ambiente desse contêiner. O comando docker exec permite iniciar um comando adicional dentro de um contêiner que já está em execução, sem recriá-lo nem reiniciá-lo.

A palavra “adicional” é importante. docker exec não substitui o processo principal do contêiner. Ele inicia outro processo dentro dos mesmos namespaces do contêiner, enquanto o serviço original continua em execução.

Você seguirá estas etapas:

  • Iniciar um contêiner Nginx em segundo plano.
  • Usar docker exec para iniciar um shell Bash interativo dentro do contêiner.
  • Executar comandos dentro do contêiner para identificar o sistema operacional.
  • Sair do contêiner e retornar ao terminal do host.

Iniciar um contêiner em segundo plano

Nesta etapa, você iniciará um novo contêiner Docker usando a imagem Nginx. Você o executará no modo “detached”, para que ele permaneça em segundo plano, e atribuirá a ele um nome específico para facilitar sua referência posteriormente.

Execute o comando a seguir no terminal:

docker run -d --name web1 nginx

Detalhamento do comando:

  • docker run: comando usado para criar e iniciar um contêiner.
  • -d: executa o contêiner no modo detached (em segundo plano).
  • --name web1: atribui o nome web1 ao contêiner.
  • nginx: imagem que será usada.

Verifique se o contêiner está em execução:

docker ps

Você deverá ver web1 na lista de contêineres ativos.

O contêiner precisa estar em execução porque docker exec funciona entrando no contexto de um contêiner existente e ativo. Ele não consegue iniciar um shell dentro de um contêiner que já foi encerrado.

Entrar no contêiner

Agora que o contêiner está em execução, você usará o comando docker exec para iniciar uma sessão de shell dentro dele. Isso funciona como fazer login no contêiner, de forma semelhante a acessar um servidor remoto por SSH.

Execute o comando a seguir:

docker exec -it web1 bash

Detalhamento do comando:

  • docker exec: executa um comando dentro de um contêiner existente.
  • -it: essa combinação é essencial para sessões interativas.
    • -i (interactive): mantém o fluxo de entrada aberto.
    • -t (tty): aloca um pseudo-terminal, fazendo com que ele se comporte como um prompt de comandos real.
  • web1: nome do contêiner de destino.
  • bash: comando que será executado dentro do contêiner. Neste caso, ele inicia o shell Bash.

Assim, docker exec significa basicamente “execute este comando dentro do contêiner”. Um shell é apenas um caso de uso comum; o comando também poderia ser ls, cat ou um utilitário de depuração.

Observe a mudança:

Depois de executar esse comando, o prompt de comandos será alterado. Ele será semelhante a root@<container-id>:/#.

Isso indica que você agora está executando comandos dentro do contêiner, isolado da máquina host.

Esse isolamento normalmente inclui a visão do sistema de arquivos, o namespace de processos e o contexto de rede. Você ainda está usando o mesmo kernel, mas agora está visualizando o ambiente delimitado do contêiner, e não o ambiente completo do host.

Inspecionar o ambiente do contêiner

Agora você está dentro do contêiner. O sistema de arquivos exibido pertence ao contêiner, não ao seu ambiente LabEx. Você pode confirmar isso verificando as informações do sistema operacional.

Execute o comando a seguir dentro do shell do contêiner:

cat /etc/os-release

Você verá uma saída com a descrição da distribuição Linux usada pela imagem Nginx, geralmente Debian.

Exemplo de saída:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

Isso confirma que o contêiner tem seu próprio ambiente de sistema operacional isolado, separado do host.

Mais precisamente, ele tem seu próprio sistema de arquivos de espaço de usuário e seu próprio ambiente de processos. Ele não possui um kernel separado, mas, por dentro, ainda pode parecer um pequeno sistema Linux independente.

Sair e retornar ao host

Quando terminar de depurar ou inspecionar o contêiner, você precisará sair da sessão do shell para retornar à máquina host.

Digite o comando a seguir dentro do contêiner:

exit

Depois de pressionar Enter, o prompt de comandos deverá voltar ao prompt padrão do usuário do LabEx.

O que aconteceu?

Você encerrou o processo Bash dentro do contêiner. No entanto, o próprio contêiner (web1) continua em execução em segundo plano, pois o processo principal, o Nginx, ainda está ativo.

Essa é a principal lição sobre o ciclo de vida do docker exec: encerrar o shell interativo não interrompe o contêiner, a menos que esse shell fosse o processo principal que definia a vida útil do contêiner.

Você pode confirmar isso executando:

docker ps

web1 ainda estará listado.

Para fazer a limpeza, você pode parar e remover o contêiner:

docker rm -f web1

Resumo

Neste laboratório, você aprendeu a acessar um contêiner em execução usando docker exec -it. Você praticou como:

  • Iniciar um contêiner em segundo plano.
  • Entrar no contêiner usando um shell Bash interativo.
  • Verificar o ambiente dentro do contêiner.
  • Sair com segurança mantendo o serviço em execução.

Essa é uma habilidade fundamental para trabalhar com Docker, pois permite investigar problemas em aplicações e inspecionar diretamente os ambientes dos contêineres.