Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

sobre o comando docker exec e sua relação com os namespaces e cgroups.

Se eu uso docker exec para rodar um comando dentro de um container em execução, esse comando herda os mesmos namespaces e cgroups do processo principal? E como faço para expor uma porta adicional depois que o container já foi criado?

2 respostas
solução!

Oi, Kayo!

O docker exec e o compartilhamento de Namespaces e Cgroups:

A resposta curta é: Sim, o comando executado via docker exec compartilha os mesmos Namespaces e Cgroups do processo principal (o PID 1 do container).

Pra entender melhor, imagine que o container é uma "caixa" com paredes invisíveis. Quando você usa o docker exec:

  • Namespaces: O Docker instrui o kernel para que esse novo processo (como o seu /bin/bash) entre nos mesmos Namespaces que o container já possui. Isso significa que o novo processo verá a mesma rede (Network Namespace), os mesmos arquivos (Mount Namespace) e a mesma árvore de processos (PID Namespace) que o processo original.
    • Nota: É por isso que, ao rodar top dentro do exec, você consegue ver o processo sleep que iniciou com o container.
  • Cgroups: O novo processo também é colocado sob as mesmas restrições de recursos (CPU, Memória, I/O) definidas para aquele container. Se o seu container tem um limite de 512MB de RAM, a soma do consumo do processo principal e do processo do exec não pode ultrapassar esse valor.

É possível expor uma porta adicional após a criação do container?

Aqui temos uma característica importante do Docker: Não é possível mapear ou expor novas portas em um container que já está em execução ou criado.

O mapeamento de portas (-p ou --publish) é uma configuração feita no momento da criação do container (docker run ou docker create). Isso acontece porque o Docker precisa configurar regras de tradução de endereços (NAT) no firewall do sistema hospedeiro (iptables/nftables) no instante em que o container sobe.

Como resolver isso na prática?

Se você esqueceu de expor uma porta, as abordagens comuns são:

  1. A forma padrão (Recriar): Pare o container, remova-o e inicie um novo com a porta desejada. Se houver dados importantes, certifique-se de usar Volumes para não perdê-los.
    docker run -d -p 80:80 -p 8080:8080 --name meu-container imagem-exemplo
    
  2. Commit (Não recomendado para produção): Você pode transformar o container atual em uma nova imagem usando docker commit e depois iniciar um novo container a partir dessa imagem com as novas portas.
  3. Reverse Proxy: Se você estiver em um ambiente mais avançado, pode usar um container de Proxy Reverso (como Nginx) na mesma rede do container para redirecionar o tráfego, mas isso geralmente é mais trabalhoso do que simplesmente recriar o container.

O fato de você ter notado que o arquivo persiste após um stop/start, mas some após um rm, mostra que você já captou a efemeridade do sistema de arquivos do container.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Perfeito!
Entendi!
Muito obrigado!