<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe Garcia</title>
    <description>The latest articles on DEV Community by Felipe Garcia (@felipesazz).</description>
    <link>https://dev.to/felipesazz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F960444%2Fb821469b-084b-4942-b806-ddd99661353c.jpg</url>
      <title>DEV Community: Felipe Garcia</title>
      <link>https://dev.to/felipesazz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipesazz"/>
    <language>en</language>
    <item>
      <title>Entendendo network drivers no Docker</title>
      <dc:creator>Felipe Garcia</dc:creator>
      <pubDate>Fri, 28 Feb 2025 20:28:30 +0000</pubDate>
      <link>https://dev.to/felipesazz/entendendo-network-drivers-no-docker-3p7a</link>
      <guid>https://dev.to/felipesazz/entendendo-network-drivers-no-docker-3p7a</guid>
      <description>&lt;p&gt;Minha experiência com programação mudou completamente no dia em que eu descobri e aprendi a usar o Docker. Conseguir subir e gerenciar serviços na minha máquina e em produção, sem me preocupar com todos os problemas de trabalhar com aplicações em ambientes diferentes, fez uma grande diferença.&lt;/p&gt;

&lt;p&gt;Mas algo que muita gente que está começando ou já usa o Docker acaba deixando passar é o conceito de redes e os tipos (drivers) de redes que existem, suas diferenças e quando usar cada uma.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a rede em containers?
&lt;/h2&gt;

&lt;p&gt;Antes de falar sobre os tipos de rede disponíveis, vale a pena dar uma visão geral de como o conceito de redes é aplicado no Docker. &lt;/p&gt;

&lt;p&gt;Quando falo de &lt;em&gt;"rede em containers"&lt;/em&gt;, estou me referindo à capacidade de containers se conectarem e se comunicarem entre si. &lt;/p&gt;

&lt;p&gt;Talvez você já tenha precisado, por exemplo, criar um container com o &lt;code&gt;nginx&lt;/code&gt; e outro com uma API REST (o nome do container poderia ser &lt;code&gt;api&lt;/code&gt;). O &lt;code&gt;nginx&lt;/code&gt; precisa se comunicar com o &lt;code&gt;api&lt;/code&gt;, ou pelo menos saber como chegar nele (através de um IP, por exemplo), e aí vem a pergunta: como fazer isso?&lt;/p&gt;

&lt;p&gt;A resposta é sempre a mesma: por meio de uma rede interna entre os containers. E existem vários tipos de redes para alcançar esse objetivo!&lt;/p&gt;

&lt;p&gt;Se você já usou o Docker Compose e usou o nome de um container dentro de outro container para fazer a comunicação (por exemplo, o container &lt;code&gt;api&lt;/code&gt; se comunicando com o &lt;code&gt;postgres&lt;/code&gt; usando o endereço &lt;code&gt;postgres&lt;/code&gt;), você já está usando uma rede criada automaticamente, que é do tipo &lt;code&gt;bridge&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com essa introdução feita, é hora de ir ao tópico principal do artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de Rede (network drivers)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bridge
&lt;/h3&gt;

&lt;p&gt;As redes do tipo &lt;code&gt;bridge&lt;/code&gt; são, provavelmente, as mais usadas no Docker. Elas permitem a comunicação básica entre containers na mesma máquina (&lt;code&gt;host&lt;/code&gt;) e na mesma rede &lt;code&gt;bridge&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esse é o tipo de rede padrão quando você cria uma rede com &lt;code&gt;docker network create&lt;/code&gt; ou quando há comunicação entre containers dentro de um Docker Compose.&lt;/p&gt;

&lt;p&gt;Quando o Docker é iniciado, ele também cria uma rede &lt;code&gt;bridge&lt;/code&gt; padrão, usada pelos containers que são criados sem especificar uma rede ou que estão fora do Compose. Essa rede é chamada de &lt;code&gt;default bridge network&lt;/code&gt; e tem algumas diferenças em relação às redes &lt;code&gt;bridge&lt;/code&gt; criadas pelo usuário (as chamadas &lt;code&gt;user-defined bridge networks&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;default bridge network&lt;/code&gt; não permite comunicação entre containers pelo nome (ou seja, não há resolução DNS), apenas pelo IP. E sim, estou ignorando a flag &lt;code&gt;--link&lt;/code&gt;, que poderia ser usada para isso, mas não é recomendada.&lt;/p&gt;

&lt;p&gt;Já as &lt;code&gt;user-defined bridge networks&lt;/code&gt; permitem comunicação entre containers pelo nome e pelo IP. Além disso, por serem mais "específicas" (criadas para containers específicos), elas oferecem uma melhor isolação comparado à rede bridge padrão.&lt;/p&gt;

&lt;p&gt;Você pode criar uma rede bridge com o comando:&lt;br&gt;
&lt;code&gt;docker network create nome_da_rede&lt;/code&gt;, e depois conectar um container a essa rede com &lt;code&gt;docker network connect nome_da_rede nome_do_container&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;bridge&lt;/code&gt;&lt;/strong&gt;: Quando você precisa de comunicação básica entre containers na mesma máquina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Host
&lt;/h3&gt;

&lt;p&gt;As redes do tipo &lt;code&gt;host&lt;/code&gt; permitem que o container se comunique com qualquer serviço exposto na máquina. Isso tem algumas implicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você perde parte da isolação dos containers em relação à máquina, o que pode gerar problemas de segurança.&lt;/li&gt;
&lt;li&gt;O container não recebe um IP exclusivo, então se ele tiver um serviço rodando na porta &lt;code&gt;80&lt;/code&gt;, esse serviço estará disponível na mesma porta no IP da máquina (o que também pode ser um risco de segurança, especialmente se for um banco de dados e o firewall não estiver bem configurado).&lt;/li&gt;
&lt;li&gt;Por conta disso, não é possível mapear portas como nas redes &lt;code&gt;bridge&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você deve estar se perguntando, com tantos problemas, por que alguém usaria uma rede &lt;code&gt;host&lt;/code&gt; em produção? A resposta é: &lt;strong&gt;performance&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Isso acontece porque você elimina camadas extras de rede e isolação, ganhando desempenho.&lt;/p&gt;

&lt;p&gt;Uma particularidade interessante é que o Docker não cria uma rede virtual isolada nesse caso, logo não é possível criar a rede usando &lt;code&gt;docker network create&lt;/code&gt;, em vez disso, basta criar o container com a flag &lt;code&gt;--network host&lt;/code&gt; no comando &lt;code&gt;docker run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;host&lt;/code&gt;&lt;/strong&gt;: Quando você precisa de alta performance e está disposto a sacrificar a segurança. Também vale a pena dar uma olhada nas redes &lt;code&gt;IPvlan&lt;/code&gt; para casos semelhantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overlay
&lt;/h3&gt;

&lt;p&gt;As redes do tipo &lt;code&gt;overlay&lt;/code&gt; permitem a comunicação entre containers em máquinas diferentes.&lt;/p&gt;

&lt;p&gt;São muito usadas no contexto do Docker Swarm para comunicação entre serviços em máquinas/nodes diferentes, mas também podem ser usadas em containers tradicionais.&lt;/p&gt;

&lt;p&gt;As redes &lt;code&gt;overlay&lt;/code&gt; podem ter a propriedade &lt;code&gt;attachable&lt;/code&gt;, que permite que containers tradicionais (containers standalone) se conectem a essa rede.&lt;/p&gt;

&lt;p&gt;Agora, um caso de uso interessante com as redes &lt;code&gt;overlay&lt;/code&gt;: Em uma situação onde você precise rodar um serviço no Docker Swarm, para tirar uma vantagem especifica da ferramenta (por exemplo: blue-green deployments ou replicas), mas não quer rodar outros serviços na mesma modalidade e ainda precisa ter a comunicação entre eles, você pode fazer uso de uma rede &lt;code&gt;overlay&lt;/code&gt; que esteja &lt;code&gt;attachable&lt;/code&gt;, e ainda possuir a escalabilidade do Docker Swarm.&lt;/p&gt;

&lt;p&gt;Você pode criar uma rede &lt;code&gt;overlay&lt;/code&gt; com a opção &lt;code&gt;attachable&lt;/code&gt; com o comando:&lt;br&gt;
&lt;code&gt;docker network create -d overlay --attachable nome_da_rede&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;overlay&lt;/code&gt;&lt;/strong&gt;: Quando você precisa de comunicação entre containers ou serviços que estão em máquinas diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  IPvlan
&lt;/h3&gt;

&lt;p&gt;As redes &lt;code&gt;IPvlan&lt;/code&gt; oferecem controle total sobre endereços IPv4 e IPv6 dos containers, usando uma rede virtual tratada como uma rede física da máquina. Elas oferecem boa performance, como a rede &lt;code&gt;host&lt;/code&gt;, mas com maior controle e possibilidade de continuar isolando o tráfego do container.&lt;/p&gt;

&lt;p&gt;Elas são mais complexas de configurar e exigem um bom conhecimento de redes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;IPvlan&lt;/code&gt;&lt;/strong&gt;: Quando você precisa de controle total sobre a rede e os endereços IPs, e tem o conhecimento necessário para configurar isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Macvlan
&lt;/h3&gt;

&lt;p&gt;As redes &lt;code&gt;Macvlan&lt;/code&gt; permitem que os containers sejam tratados como dispositivos independentes na rede da máquina/host. Cada container recebe seu próprio endereço MAC, como se fosse um dispositivo físico, como um computador ou celular.&lt;/p&gt;

&lt;p&gt;Esse tipo de rede permite que os containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comuniquem-se diretamente com a rede externa, como outros dispositivos na rede física.&lt;/li&gt;
&lt;li&gt;Enviem e recebam pacotes diretamente da rede física, sem passar pela máquina/host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porém, isso pode causar problemas na rede física.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;Macvlan&lt;/code&gt;&lt;/strong&gt;: Quando os containers precisam de acesso direto à rede física (como para monitorar o tráfego da rede).&lt;/p&gt;

&lt;h3&gt;
  
  
  None
&lt;/h3&gt;

&lt;p&gt;Se você precisa isolar completamente um container da rede, pode usar a rede &lt;code&gt;none&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar redes &lt;code&gt;None&lt;/code&gt;&lt;/strong&gt;: Quando você precisa de isolamento total de um container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusões
&lt;/h2&gt;

&lt;p&gt;Pode ser que você nunca precise usar alguns desses tipos de rede, mas acredite, saber qual tipo de rede usar para comunicação entre containers ou serviços vai ser bem útil e vai evitar gambiarra (falo isso por experiência própria).&lt;/p&gt;




&lt;p&gt;Foto de &lt;a href="https://unsplash.com/pt-br/@chuttersnap?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;CHUTTERSNAP&lt;/a&gt; na &lt;a href="https://unsplash.com/pt-br/fotografias/vista-aerea-de-conteineres-intermodais-xewrfLD8emE?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>network</category>
    </item>
  </channel>
</rss>
