Os quatro modos de rede do Docker
Quatro modos de rede
Modo de rede Docker | Configuração | Descrição |
---|---|---|
modo host | –Net = host | O contêiner e o host compartilham o namespace da rede |
modo de contêiner | –Net = container: NAME_or_ID | O container e outro container compartilham o namespace Network. O pod no kubernetes é que vários contêineres compartilham um namespace de rede |
modo nenhum | –Net = nenhum | O contêiner tem um namespace de rede independente, mas não tem nenhuma configuração de rede para ele, como atribuição de par veth e conexão de ponte, configuração de IP, etc. |
Modo Ponte | –Net = ponte | O modo mais comumente usado (o padrão é este modo) |
Princípio de realização
-
O Docker usa pontes do Linux para virtualizar uma ponte de contêiner Docker (docker0) no host. Quando o Docker inicia um contêiner, ele atribui um endereço IP ao contêiner de acordo com o segmento de rede da ponte Docker, chamado Container-IP. Ao mesmo tempo, a ponte Docker é O gateway padrão de cada contêiner. Como os contêineres no mesmo host estão todos conectados à mesma ponte, os contêineres podem se comunicar diretamente por meio do Container-IP do contêiner.
-
A ponte Docker é virtualizada pelo host e não é um dispositivo de rede real. A rede externa não pode ser endereçada. Isso também significa que a rede externa não pode acessar o contêiner por meio do Container-IP direto. Se o contêiner quiser que o acesso externo seja acessível, você pode mapear a porta do contêiner para o host host (mapeamento de porta), ou seja, usar o parâmetro -p ou -P para habilitar a execução do docker ao criar o contêiner e usar o [IP do host] ao acessar o contêiner: [Container Port] Acesse o container.
Modo host
-
O contêiner não virtualizará sua própria placa de rede, configurará seu próprio IP, etc., mas usará o IP e a porta do host
-
Se o modo de host for usado ao iniciar o contêiner, o contêiner não obterá um namespace de rede independente, mas compartilhará um namespace de rede com o host. O contêiner não virtualizará sua própria placa de rede, configurará seu próprio IP etc., mas usará o IP e a porta do host. No entanto, outros aspectos do contêiner, como o sistema de arquivos e a lista de processos, ainda estão isolados do host.
-
O contêiner que usa o modo de host pode usar diretamente o endereço IP do host para se comunicar com o mundo externo, e a porta de serviço dentro do contêiner também pode usar a porta do host sem NAT. A maior vantagem do host é que o desempenho da rede é melhor, mas já está no host docker. A porta usada não pode mais ser usada e o isolamento da rede não é bom.
-
O modo Host é mostrado na figura abaixo:
Modo container
-
O contêiner criado não criará sua própria placa de rede e configurará seu próprio IP, mas compartilhará o IP e o intervalo de portas com um contêiner especificado
-
Este modo especifica que o container recém-criado compartilha um namespace de rede com um container existente em vez de compartilhar com o host. O contêiner recém-criado não criará sua própria placa de rede e configurará seu próprio IP, mas compartilhará o IP, o intervalo de portas etc. com um contêiner especificado. Da mesma forma, além dos aspectos de rede dos dois contêineres, outras coisas, como o sistema de arquivos e a lista de processos, ainda estão isolados. Os processos dos dois contêineres podem se comunicar por meio do dispositivo de placa de rede lo.
-
Diagrama esquemático do modo Container:
Modo nenhum
-
Este modo desativa a função de rede do contêiner
-
No modo nenhum, o contêiner Docker tem seu próprio Network Namespace, mas não executa nenhuma configuração de rede para o contêiner Docker. Em outras palavras, este contêiner Docker não tem placa de rede, IP, roteamento e outras informações. Precisamos adicionar placas de rede e configurar o IP para o contêiner Docker.
-
Nesse modo de rede, o contêiner possui apenas uma rede de loopback e nenhuma outra placa de rede. O modo nenhum pode ser especificado por --network = none quando o contêiner é criado. Não há como se conectar a este tipo de rede. Uma rede fechada pode garantir a segurança do contêiner.
-
Diagrama esquemático do modo Nenhum:
Modo Ponte
-
Este modo irá alocar e definir IP para cada contêiner, e conectar o contêiner a uma ponte virtual docker0, através da ponte docker0 e a associação entre a configuração da tabela nat do iptables e o host
-
Quando o processo Docker é iniciado, uma ponte virtual chamada docker0 será criada no host, e o contêiner Docker iniciado neste host será conectado a esta ponte virtual. A ponte virtual funciona como um switch físico, de forma que todos os contêineres no host sejam conectados a uma rede da Camada 2 por meio do switch.
-
Atribua um IP ao contêiner da sub-rede docker0 e defina o endereço IP de docker0 como o gateway padrão do contêiner. Crie um par de dispositivos de par de placa de rede virtual no host. O Docker coloca uma extremidade do dispositivo de par de veth no contêiner recém-criado e o nomeia eth0 (a placa de rede do contêiner), e a outra extremidade é colocada no host com um nome semelhante como vethxxx Nomeie-o e adicione este dispositivo de rede à ponte docker0. Ele pode ser visualizado por meio do comando brctl show.
-
O modo bridge é o modo de rede padrão do docker. Sem o parâmetro -net, é o modo bridge. Ao usar docker run -p, o docker cria regras DNAT no iptables para realizar a função de encaminhamento de porta. Você pode usar iptables -t nat -vnL para visualizar.
-
O modo bridge é mostrado na figura abaixo:
Resumo: Os acima são todos viva-voz, o que realmente precisa ser configurado é uma rede personalizada