- Princípios Fundamentais do Mapeamento de Portas em Contêineres
- Desafios de Adicionar Dinamicamente Mapeamentos de Portas
- 2.1 Criando um Contêiner Proxy Usando docker network
- 2.2 Adicionando Manualmente Regras de Encaminhamento de Portas Usando iptables
- 2.3 Usando socat para Criar Encaminhamento de Portas
- 2.4 Atualizando Dinamicamente Serviços Usando Docker Compose
- 2.5 Modificando Forçadamente o Arquivo de Configuração do Contêiner
O mapeamento de portas é um aspecto crucial no desenvolvimento e implantação de aplicações em contêineres. Normalmente, estabelecemos uma conexão entre a porta interna de um contêiner e uma porta no host ao criar o contêiner. No entanto, há situações em que precisamos adicionar dinamicamente novos mapeamentos de portas a um contêiner já em execução. Isso pode ser especialmente útil durante o desenvolvimento, depuração ou ao expor temporariamente novos endpoints de serviço. Este artigo fornecerá uma explicação detalhada de como adicionar dinamicamente mapeamentos de portas a um contêiner sem precisar pará-lo.
1.Conhecimento Básico
Princípios Fundamentais do Mapeamento de Portas em Contêineres
No Docker, a conexão entre a porta interna de um contêiner e a porta do host é facilitada através do mapeamento de portas. Geralmente, especificamos os mapeamentos de portas usando os parâmetros -p ou --publish ao iniciar um contêiner, conforme ilustrado abaixo:
docker run -d -p 8080:80 nginx
O comando acima mapeia a porta 8080 do host para a porta 80 dentro do contêiner. Como resultado, usuários externos podem acessar o serviço web em execução no contêiner através da porta 8080 do host.
Desafios de Adicionar Dinamicamente Mapeamentos de Portas
Uma vez que um contêiner é iniciado, o Docker geralmente não suporta a adição dinâmica de novos mapeamentos de portas. Em outras palavras, os mapeamentos iniciais permanecem fixos durante todo o ciclo de vida do contêiner. Se precisar adicionar mais mapeamentos, a abordagem tradicional envolve parar e reiniciar o contêiner, o que pode interromper serviços e é inaceitável em ambientes de produção.
2.Soluções de Implementação
Para adicionar dinamicamente mapeamentos de portas a um contêiner em execução, vários métodos podem ser empregados:
2.1 Criando um Contêiner Proxy Usando docker network
Um novo contêiner proxy pode ser criado na mesma rede do contêiner original, e os novos mapeamentos de portas podem ser adicionados ao contêiner proxy. Os passos específicos são os seguintes: Primeiro, crie um contêiner proxy na mesma rede do contêiner original:
docker run -d --name proxy-container --net container:your-container nginx
Em seguida, adicione o mapeamento de porta desejado ao contêiner proxy:
docker run -d -p 8081:81 --net container:your-container nginx
Use com cuidado. Embora este método permita adicionar novos mapeamentos de portas sem modificar o contêiner original, ele introduz uma instância adicional de contêiner e pode não ser adequado para todos os cenários.
2.2 Adicionando Manualmente Regras de Encaminhamento de Portas Usando iptables
Modificando o iptables, você pode encaminhar requisições de uma porta específica no host para a porta interna do contêiner Docker em execução. Por exemplo, para mapear a porta 8081 do host para a porta 81 no contêiner, use o seguinte comando:
iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination <container_ip>:81
Onde <container_ip> é o endereço IP interno do contêiner, que pode ser obtido usando o comando docker inspect. Este método oferece total flexibilidade para adicionar mapeamentos de portas, mas requer um bom entendimento de iptables e não é recomendado para uso frequente em ambientes de produção devido à sua complexidade.
2.3 Usando socat para Criar Encaminhamento de Portas
socat é uma ferramenta de rede versátil que pode estabelecer encaminhamento de portas entre o host e um contêiner. Você pode executar o seguinte comando para encaminhar uma porta específica no host para uma porta designada no contêiner:
socat TCP-LISTEN:8081,fork TCP:<container_ip>:81
Use com cuidado. A vantagem deste método é que não requer parar o contêiner. No entanto, como o socat é um processo adicional, você deve estar atento ao seu desempenho e estabilidade. Outras ferramentas de encaminhamento de portas podem alcançar resultados semelhantes.
2.4 Atualizando Dinamicamente Serviços Usando Docker Compose
Se sua aplicação utiliza Docker Compose para gerenciar contêineres, você pode adicionar novos mapeamentos de portas atualizando o arquivo docker-compose.yml e executando docker-compose up. Este método é conveniente e oferece gerenciamento unificado, mas cada atualização requer a reaplicação do arquivo Compose, o que pode levar a interrupções temporárias do serviço.
2.5 Modificando Forçadamente o Arquivo de Configuração do Contêiner
Primeiro, modifique diretamente o arquivo /var/lib/docker/containers/<container_id>/config.v2.json, adicionando o mapeamento de HostPort 8081 para a porta 81 no contêiner. Observe que você precisa modificar duas seções. Em uma seção, você só precisa adicionar HostPort 8081:
"ExposedPorts": {
"8080/tcp": {}
"8081/tcp": {}
},
Na outra seção, você precisa adicionar a relação completa de mapeamento:
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
},
],
"81/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8081"
},
]
},
Além disso, você também precisa modificar /var/lib/docker/containers/<container_id>/hostconfig.json e adicionar o novo mapeamento:
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
},
"81/tcp": [
{
"HostIp": "",
"HostPort": "8081"
}
]
},
Finalmente, você precisa reiniciar o dockerd:
sudo systemctl restart docker
Este método pode adicionar permanentemente mapeamentos de portas ao contêiner, mas também tem o efeito colateral de parar todos os contêineres no host devido à reinicialização do dockerd. Se os contêineres não estiverem configurados para inicialização automática, eles não iniciarão automaticamente mesmo após o dockerd ser reiniciado. Embora este método seja eficaz, ele pode ter um impacto significativo nos contêineres em execução e não é recomendado em ambientes de produção.
3.Conclusão
Embora adicionar dinamicamente mapeamentos de portas a contêineres não seja um recurso nativo do Docker, os métodos descritos acima podem ajudar a alcançar isso até certo ponto. Cada método tem suas vantagens e desvantagens, e os desenvolvedores podem escolher o mais adequado com base em suas necessidades específicas. Em ambientes de produção, recomenda-se o uso de contêineres proxy ou Docker Compose, pois são relativamente simples e apresentam menos riscos. Para aplicações que exigem alterações frequentes nos mapeamentos de portas, é aconselhável considerar uma arquitetura de rede flexível durante a fase de design para evitar modificações frequentes nos mapeamentos enquanto o contêiner está em execução, minimizando assim as interrupções de serviço.
Você pode visitar Novita AI para mais detalhes!
