Tutorial

O Ecossistema do Docker: Rede e Comunicação

Published on June 26, 2015
Português
O Ecossistema do Docker: Rede e Comunicação

Introdução

Ao construir sistemas distribuídos para servir contêineres Docker, comunicação e rede tornam-se extremamente importantes. A arquitetura orientada a serviço, inegavelmente, depende muito de comunicação entre os componentes, de forma a funcionar corretamente.

Neste guia, vamos discutir as diversas estratégias de rede e ferramentas utilizadas para moldar as redes utilizadas pelos contêineres em seu estado desejado. Algumas situações podem tirar vantagem de soluções nativas do Docker, enquanto outras podem utilizar projetos alternativos.

Implementação Nativa de Rede do Docker

O Docker em si, fornece muitos dos fundamentos de rede necessários para a comunicação contêiner-para-contêiner e contêiner-para-host.

Quando o processo do Docker em si é iniciado, ele configura uma nova interface virtual de bridge chamada docker0 no sistema host. Esta interface permite ao Docker alocar uma sub-rede virtual para utilizar entre os contêineres que ele irá executar. A bridge irá servir como ponto principal de interface entre a rede dentro do contêiner e a rede no host.

Quando um contêiner é inicializado pelo Docker, uma nova interface virtual é criada e é dado a ela um endereço dentro da faixa da sub-rede da bridge. O endereço IP é ligado à rede interna do contêiner, fornecendo à rede do contêiner um caminho para a bridge docker0 no sistema host. O Docker automaticamente configura as regras do iptables para permitir encaminhamento e configura o mascaramento via NAT para tráfego originado na docker0 destinado ao mundo externo.

Como os Contêineres Expõem os Serviços para os Consumidores?

Outros contêineres no mesmo host estão aptos a acessarem serviços fornecidos pelos seus vizinhos sem qualquer configuração adicional. O sistema host irá simplesmente rotear as requisições originadas, e destinadas à interface docker0 para a localização apropriada.

Os contêineres podem expor suas portas para o host, onde eles podem receber tráfego encaminhado a partir do mundo externo. As portas expostas podem ser mapeadas para o sistema host, seja selecionando uma porta específica, seja permitindo ao Docker escolher uma porta alta, aleatória e que não esteja em uso. O Docker cuida de quaisquer regras e configurações do iptables para rotear corretamente os pacotes nestas situações.

Qual é a Diferença Entre Expor e Publicar uma Porta?

Ao criar imagens de contêiner ou executar um contêiner, você tem a opção de expor portas ou publicar portas. A diferença entre as duas coisas é significativa, mas pode não ser perceptível imediatamente.

Expor uma porta significa simplesmente que o Docker tomará conhecimento que a porta em questão é utilizada pelo contêiner. Isto pode então ser utilizado para propósitos de descoberta e para vinculação. Por exemplo, inspecionar um contêiner dará a você informações sobre as portas expostas. Quando contêineres estão vinculados, variáveis serão definidas no novo contêiner indicando as portas que estavam expostas no contêiner original.

Por padrão, os contêineres estão acessíveis ao sistema host e para quaisquer outros contêineres no host, independentemente se as portas estão expostas. Expor a porta simplesmente documenta o uso da porta e torna esta informação disponível para mapeamentos automáticos e vinculações.

Em contraste, publicar uma porta irá mapeá-la para a interface do host, tornando-a disponível para o mundo externo. As portas de um contêiner podem ser mapeadas para uma porta específica no host, ou o Docker poderá selecionar automaticamente um porta alta, sem uso, aleatoriamente.

O Docker fornece um mecanismo chamado “Docker links” para a configuração da comunicação entre contêineres. Se um novo contêiner é ligado ou vinculado a um contêiner existente, ao novo contêiner será dado informações de conexão para o contêiner existente através de variáveis de ambiente.

Isto fornece uma forma fácil de se estabelecer comunicação entre dois contêineres, dando ao novo contêiner informação explícita sobre como acessar o seu companheiro. As variáveis de ambiente são definidas de acordo com as portas expostas pelo outro contêiner. O endereço IP e outras informações serão preenchidas pelo próprio Docker.

Projetos Para Expansão das Capacidades de Rede do Docker

O modelo de rede discutido acima fornece um bom ponto de partida para construção da rede. A comunicação entre contêineres no mesmo host é bastante simples e a comunicação entre hosts pode ocorrer sobre redes públicas regulares, uma vez que as portas estão mapeadas corretamente e a informação de conexão é fornecida à outra parte.

Contudo, muitas aplicações requerem ambientes de rede específicos para propósitos de segurança ou de funcionalidade. A funcionalidade nativa de rede do Docker é algo limitado nesses cenários. Por causa disto, muitos projetos foram criados para expandir o ecossistema de rede do Docker.

Criação de Redes Sobrepostas para Abstrair a Topologia Subjacente

Uma melhoria funcional que vários projetos tem focado é o estabelecimento de redes sobrepostas. Um rede sobreposta é uma rede virtual construída sobre conexões de rede existentes.

O estabelecimento de redes sobrepostas permite a você criar um ambiente de rede mais previsível e uniforme entre os hosts. Isto pode simplificar a rede entre os contêineres independentemente de onde eles estão executando. Uma única rede virtual pode se espalhar por múltiplos hosts ou sub-redes específicas podem ser designadas para cada host dentro de uma rede unificada.

Um outro uso de uma rede sobreposta é na construção de fabric de clusters de computação. Na computação fabric, vários hosts são abstraídos e gerenciados como um única entidade, mais potente. A implementação de uma camada de computação fabric permite ao usuário final gerenciar o cluster por inteiro em vez de hosts individuais. A rede desempenha um grande papel nesse cluster.

Configuração de Rede Avançada

Outros projetos expandem as capacidades de rede do Docker fornecendo mais flexibilidade.

A configuração padrão de rede do Docker é funcional, mas bastante simples. Essas limitações se manifestam mais plenamente quando se lida com a rede entre hosts, mas também pode impedir requisitos de rede mais personalizados dentro de um único host.

A funcionalidade adicional é fornecida através de capacidades adicionais de canalização. Estes projetos não fornecem uma configuração fora da caixa, mas eles permitem a você agrupar peças e criar cenários de rede complexos. Algumas das habilidades que você pode ganhar vão desde simplesmente estabelecer rede privada entre certos hosts, até configuração de bridges, vlans, sub-redes customizadas e gateways.

Existe também uma série de ferramentas e projetos que, mesmo não desenvolvidas com o Docker em mente, são geralmente utilizadas em ambientes Docker para fornecer a funcionalidade necessária. Em particular, tecnologias maduras de rede e tunelamento são geralmente utilizadas para fornecer comunicação segura entre hosts e entre contêineres.

Quais São Alguns dos Projetos Comuns para Melhorar as Redes do Docker?

Existem alguns projetos diferentes focados no fornecimento de sobreposição de rede para hosts Docker. Os mais comuns são:

  • flannel: Desenvolvido pelo time do CoreOS, este projeto foi inicialmente desenvolvido para fornecer a cada sistema host a sua própria sub-rede da rede compartilhada. Esta é uma condição necessária para que a ferramenta de orquestração dos Kubernetes do Google funcione, mas isso é útil em outras situações.

  • weave: O Weave cria uma rede virtual que interliga cada máquina host em conjunto. Isto simplifica o roteamento de aplicação e dá a aparência de que cada contêiner está sendo conectado em um único switch de rede.

Em termos de rede avançada, os seguintes projetos visam preencher uma lacuna, fornecendo canalização adicional:

  • pipework: Construído como uma medida paliativa até que a rede nativa do Docker se tornasse mais avançada, este projeto permite o fácil manuseio de configurações de rede arbitrariamente avançadas.

Um exemplo relevante de software existente, cooptado para adicionar funcionalidade ao Docker é:

  • tinc: O Tinc é um software de VPN leve que é implementado utilizando túneis e criptografia. O Tinc é uma solução robusta que pode tornar a rede privada transparente para quaisquer aplicações.

Conclusão

Fornecer serviços internos e externos através de componentes conteinerizados é um modelo muito poderoso, mas as considerações de rede tornam-se uma prioridade. Embora o Docker forneça algumas dessas funcionalidades nativamente através de interfaces virtuais, sub-redes, iptables e gerenciamento de tabela NAT, outros projetos foram criados para fornecer configurações mais avançadas.

No próximo guia, discutiremos como os agendadores e ferramentas de orquestração constroem em cima dessa fundação para fornecer funcionalidade de gerenciamento de cluster de contêineres.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


Tutorial Series: O Ecossistema do Docker

About the authors


Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel