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?
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?
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:
/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.top dentro do exec, você consegue ver o processo sleep que iniciou com o container.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.
Se você esqueceu de expor uma porta, as abordagens comuns são:
docker run -d -p 80:80 -p 8080:8080 --name meu-container imagem-exemplo
docker commit e depois iniciar um novo container a partir dessa imagem com as novas portas.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.
Perfeito!
Entendi!
Muito obrigado!