Melhore a Comunicação: Domine o DNS Interno no Docker

Quando trabalhamos com contêineres, descobrir e endereçar serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. internamente é fundamental para a comunicação entre diferentes partes de uma aplicação distribuída. O Docker disponibiliza um DNS interno que simplifica a descoberta de serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras., eliminando a necessidade de configurações manuais de /etc/hosts ou a dependência de IPs fixos. Neste tutorial, exploraremos como o DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. realiza essa mágica e como você pode aproveitar essa funcionalidade para construir soluções mais organizadas e escaláveis.

Visão Geral do DNS Interno🔗

O DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. introduz um DNS interno que se comporta como um servidor de resolução de nomes para contêineres pertencentes à mesma rede. Quando você cria uma redeConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. definida pelo usuário (chamada de user-defined network), o DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. configura automaticamente:

1. Um DNS embutido que escuta em 127.0.0.11 dentro de cada contêiner.

2. A capacidade de cada contêiner se comunicar pelo nome de serviço definido ou pelo nome do contêiner.

Assim, sempre que você “sobe” novos contêineres naquela rede, eles são registrados dinamicamente. Isso facilita a atualização de serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. e torna o processo de rotear chamadas pela rede sem se preocupar em reconfigurar IPs.

Quando o DNS Interno Funciona🔗

Por padrão, o DNS interno do DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. funciona da seguinte forma:

Para usufruir dessa flexibilidade, é altamente recomendado criar redes personalizadasCriando redes personalizadas em Docker: passo a passoCriando redes personalizadas em Docker: passo a passoAprenda como criar e gerenciar redes Docker personalizadas para isolar containers, controlar endereços IP e otimizar a comunicação em sua aplicação. para agrupar contêineres que precisam se enxergar, pois o DNS interno estará habilitado automaticamente.

Criando uma Rede Personalizada🔗

É simples criar uma rede personalizadaCriando redes personalizadas em Docker: passo a passoCriando redes personalizadas em Docker: passo a passoAprenda como criar e gerenciar redes Docker personalizadas para isolar containers, controlar endereços IP e otimizar a comunicação em sua aplicação. antes de iniciar seus contêineres. Por exemplo:

docker network create minha-rede

Em seguida, podemos executar contêineres e conectá-los a esta redeConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras.:

docker run -d --name meu-banco --network minha-rede \

docker run -d --name minha-app --network minha-rede \
  • p 8080:80 minha-imagem-de-app

Dentro do contêiner minha-app, o banco de dados poderá ser acessado pelo hostname meu-banco (em vez de precisar de um IP específico).

Exemplo Prático com Docker Compose🔗

Para equipes de DevOps e desenvolvedores que trabalham com aplicações multi-contêiner, o Docker ComposeIntrodução ao Docker Compose: conceitos e benefíciosIntrodução ao Docker Compose: conceitos e benefíciosAprenda a orquestrar contêineres com Docker Compose, obtendo configurações unificadas e execução simplificada para ambientes de produção. facilita ainda mais. Por padrão, cada serviço definido em um arquivo docker-compose.ymlAutomatizando a implantação de ambientes com Docker ComposeAutomatizando a implantação de ambientes com Docker ComposeDescubra como automatizar a implantação de ambientes com Docker Compose, garantindo consistência, escalabilidade e agilidade no desenvolvimento. é registrado no DNS interno da rede que o ComposeConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. cria automaticamente.

Abaixo, um trecho simples de exemplo:

version: '3.8'
services:
  db:
    image: postgres:15
    environment:

  web:
    image: minha-imagem-de-app
    ports:
  • "8080:80"
depends_on:
  • db

O ComposeConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. cria uma rede (geralmente chamada <nome_do_projeto>_default), e tanto db quanto web ficam acessíveis via DNS interno. Assim, a aplicação web pode se conectar ao banco de dados em db:5432.

Verificando a Resolução de Nomes🔗

Dentro de um contêiner, você pode verificar o DNS interno executando, por exemplo, um comando de ping no outro serviço:

ping db

Se os contêineres estiverem na mesma rede DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos., você deverá ver o hostname db resolvido para um IP interno. Além disso, se você estiver rodando múltiplas instâncias do mesmo serviço, o DNS interno fará round-robin entre elas (quando essa funcionalidade for relevante para balanceamento de cargaResiliência e balanceamento de carga em redes DockerResiliência e balanceamento de carga em redes DockerDescubra como implementar resiliência e balanceamento de carga em redes Docker, garantindo alta disponibilidade e desempenho contínuo mesmo em casos de falha. dentro da rede Docker).

Tabela de Configurações Úteis🔗

Na tabela a seguir, destacamos algumas configurações importantes relacionadas ao DNS interno:

ConfiguraçãoDescrição
--network minha-redeConecta o contêiner à rede definida pelo usuário
docker network create --driver bridge ...Cria uma rede com driver bridge para permitir DNS interno
container_name: no Docker ComposeDefine um nome fixo para o contêiner, tornando o DNS mais previsível
depends_on: no Docker ComposeGarante que um contêiner seja iniciado antes do outro, mas não afeta DNS
/etc/resolv.conf dentro do contêinerApontará para o DNS do Docker em 127.0.0.11

Boas Práticas🔗

1. Use redesConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. definidas pelo usuário: evite usar a bridgeIsolamento de rede: bridge, host e overlay networksIsolamento de rede: bridge, host e overlay networksExplore os diferentes drivers de rede do Docker: bridge, host e overlay, e saiba como conseguir isolamento, escalabilidade e segurança para containers. padrão para comunicação interna, pois você perde a vantagem do DNS automatizado.

2. Organize serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. por domínio de responsabilidade: crie múltiplas redesConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. se partes da aplicação não precisarem se comunicar entre si. Isso melhora a segurança e simplifica a estrutura de rede.

3. Mantenha nomes descritivos nos serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras.: facilitará a leitura do código e a manutenção dos ambientes.

Conclusão🔗

O DNS interno e a descoberta de serviçosConfiguração de aplicações multi-container com Docker ComposeConfiguração de aplicações multi-container com Docker ComposeConfigure múltiplos contêineres com Docker Compose e otimize a comunicação entre serviços, volumes e redes para aplicações escaláveis e seguras. no DockerDocker vs Máquinas Virtuais: principais diferenças e casos de usoDocker vs Máquinas Virtuais: principais diferenças e casos de usoDescubra neste tutorial as principais diferenças entre Docker e Máquinas Virtuais, explorando desempenho, arquitetura e casos de uso práticos. constituem uma peça fundamental para o desenvolvimento de aplicações distribuídas e de fácil manutenção. Graças a esse recurso, contêineres podem se comunicar usando nomes lógicos em vez de depender de IPs inconstantes ou configurações manuais. Aproveitar esta abordagem simplifica a colaboração entre equipes, pois torna a infra-estrutura mais clara e confiável.

Com essas práticas em mãos, você está pronto para estruturar serviços de forma organizada, garantindo que os recursos do seu ambiente Docker sejam encontrados com facilidade e robustezResiliência e balanceamento de carga em redes DockerResiliência e balanceamento de carga em redes DockerDescubra como implementar resiliência e balanceamento de carga em redes Docker, garantindo alta disponibilidade e desempenho contínuo mesmo em casos de falha..

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

  • Documentação do Docker Engine, que aborda a configuração e o comportamento interno dos contêineres, sendo útil para entender como o DNS interno opera: docs.docker.com/engine/
  • Documentação oficial do Docker, que fornece uma visão geral e detalhes sobre o funcionamento dos contêineres, incluindo o DNS interno: docs.docker.com/
  • Guia oficial do Docker Compose, essencial para configurar aplicações multi-contêiner e observar como a descoberta de serviços é tratada automaticamente: docs.docker.com/compose/
  • Referência de linha de comando Docker CLI, que auxilia na execução de comandos como 'docker network' e 'docker run', demonstrados no tutorial: docs.docker.com/engine/reference/commandline/docker/

Compartilhar artigo

Artigos Relacionados