[Docker] notas de estudo (dois)

Quando o Docker é instalado, ele cria automaticamente três redes, ponte (cria um contêiner para se conectar a esta rede por padrão), nenhum, host

Modo de rede
Introdução
Hospedeiro 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.
Ponte Este modo alocará e definirá o IP para cada contêiner, conectará o contêiner a uma ponte virtual docker0 e se comunicará com o host por meio da ponte docker0 e da configuração da tabela nat Iptables.
Nenhum Este modo desativa a função de rede do contêiner.
Recipiente 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.

1. Rede padrão

Quando você instala o Docker, ele cria automaticamente três redes. Você pode usar o seguinte docker network lscomando para listar essas redes:

Insira a descrição da imagem aqui

O Docker construiu essas três redes, ao executar o contêiner, você pode usar este –networksinalizador para especificar qual contêiner deve ser conectado à rede.

O representante da rede de bridge docker0É a rede que existe em todas as instalações do Docker. A menos que você use essa docker run --network=XXXopção e especifique o contrário, o daemon padrão do Docker se conectará a este contêiner de rede.

Insira a descrição da imagem aqui

Usamos docker runao criar um contêiner do Docker, você pode usar --neto contêiner de opções do modo de rede especificado, o Docker pode ter os seguintes quatro tipos de modos de rede:

  • modo de host: uso --net=hostespecificado
  • modo nenhum: use para --net=noneespecificar
  • modo de ponte: use --net=bridgeas configurações padrão especificadas
  • modo de contêiner: uso --net=container:NAME_or_IDespecificado

2. Modo host

É equivalente ao modo bridge no VMware, está na mesma rede da máquina host, mas não possui um endereço IP separado .

Como todos sabemos, o Docker usa a tecnologia de namespaces do Linux para isolamento de recursos, como processo de isolamento de namespace PID, sistema de arquivos de isolamento de Mount Namespace, rede de isolamento de namespace de rede, etc.

Um namespace de rede fornece um ambiente de rede independente, incluindo placas de rede, roteamento, regras Iptable, etc., isoladas de outros namespaces de rede. Um contêiner Docker geralmente é atribuído a um namespace de rede independente. Mas 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 .

Insira a descrição da imagem aqui

Como você pode ver, a rede do contêiner usa a rede do host (aqui está o IP da intranet da minha nuvem Tencent), mas outros aspectos do contêiner, como o sistema de arquivos, lista de processos, etc., ainda estão isolados do host.

3. Modo de contêiner

Depois de entender o modo de host, esse modo é fácil de entender. Este modo especifica que o contêiner recém-criado compartilha um Namespace de rede com um contêiner existente em vez de compartilhar com o host . O contêiner recém-criado não criará sua própria placa de rede, configurará seu próprio IP, mas compartilhará o IP, 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 sistemas de arquivos e listas de processos, ainda estão isolados . Os processos dos dois contêineres podem se comunicar por meio do dispositivo de placa de rede IO.

4. Modo nenhum

Este modo coloca o contêiner em sua própria pilha de rede, mas não executa nenhuma configuração. Na verdade, esse modo desativa a função de rede do contêiner , o que é útil nas duas situações a seguir: o contêiner não requer uma rede (por exemplo, apenas uma tarefa em lote de gravação de volumes de disco).

5. Modo ponte

Equivalente ao modo Nat no VMware, o contêiner usa um namespace de rede independente e é conectado à placa de rede virtual docker0 (modo padrão). Comunique-se com o host por meio da ponte docker0 e da configuração da tabela Iptables nat; o modo ponte é a configuração de rede padrão do Docker. Este modo alocará o namespace de rede, definirá IP etc. para cada contêiner e conectará o contêiner Docker em um host para um virtual na ponte. O seguinte enfoca este modo.

5.1 Topologia do Modo Bridge

Quando o servidor Docker for 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 . A próxima etapa é atribuir um IP ao contêiner. O Docker selecionará um endereço IP e uma sub-rede diferente do host do segmento de rede IP privado definido por RFC1918 e o atribuirá a docker0. O contêiner conectado a docker0 fará a seleção desta sub-rede. Um IP desocupado é usado. Como o Docker geral usa o segmento de rede 172.18.0.0/16 e 172.18.0.1/16 alocado para a ponte docker0 (no host usando o ip addrcomando pode ser visto docker0 pode pensar que é uma interface de gerenciamento de ponte, em Usado como uma placa de rede virtual no host).

Isso pode ser porque minha intranet da nuvem Tencent é 172.17.XX.XX, então, por padrão, docker0 usa o segmento de rede 18

A topologia de rede em um ambiente autônomo é a seguinte:

Insira a descrição da imagem aqui

5.2 Explicação detalhada do modo de rede de ponte

O Docker completa o processo de configuração de rede acima mais ou menos assim:

  1. Crie um par de dispositivos de par de placa de rede virtual no host. Os dispositivos Veth sempre aparecem em pares, eles formam um canal de dados e os dados entram de um dispositivo e, em seguida, saem de outro dispositivo . Portanto, os dispositivos veth são freqüentemente usados ​​para conectar dois dispositivos de rede.

  2. O Docker coloca uma extremidade do dispositivo veth pair no contêiner recém-criado e o nomeia eth0. A outra extremidade é colocada no host, com o nome de um nome semelhante, como veth5f56268, e esse dispositivo de rede é adicionado à ponte docker0, que pode ser visualizada por meio do comando brctl show.

    [root@VM-0-4-centos ~]# brctl show
    bridge name	  bridge id	          STP enabled     interfaces
    docker0	      8000.0242652b8c9d   no              veth5f56268
    
  3. 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.

    Execute o contêiner:

    docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
    

    Veja o contêiner:

    docker ps
    

    Insira a descrição da imagem aqui

    docker inspect nginx_bridge
    

    Insira a descrição da imagem aqui

    docker network inspect bridge
    

    Insira a descrição da imagem aqui

6. - link

Considere um cenário onde escrevemos um microsserviço.Como acessar o container pelo nome para evitar a inacessibilidade do projeto devido à mudança do IP do container?

Insira a descrição da imagem aqui

Podemos usar --linkpara resolver

docker run -d -P --name tomcat03 --link tomcat02 tomcat

Insira a descrição da imagem aqui

No entanto, essa conexão é unilateral:

Insira a descrição da imagem aqui

O desenvolvimento real não usará --link

7. Rede personalizada

É recomendável usar uma ponte personalizada para controlar quais contêineres podem se comunicar entre si e também pode resolver automaticamente nomes de contêiner para endereços IP por meio de DNS. O Docker fornece drivers de rede padrão para a criação dessas redes. Você pode criar uma nova rede Bridge, Overlay ou Macvlan. Você também pode criar um plug-in de rede ou rede remota para personalização e controle completos.

Você pode criar quantas redes precisar e conectar contêineres a nenhuma ou mais dessas redes a qualquer momento. Além disso, você pode conectar e desconectar contêineres em execução na rede sem reiniciar o contêiner. Quando um contêiner é conectado a várias redes, suas conexões externas são fornecidas em ordem lexical por meio da primeira rede não interna.

Uma rede Bridge é o tipo de rede mais comumente usado no Docker. A rede com ponte é semelhante à rede com ponte padrão, mas adiciona alguns novos recursos e remove alguns recursos antigos. O exemplo a seguir cria algumas redes em ponte e realiza alguns experimentos em contêineres nessas redes.

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

Insira a descrição da imagem aqui

Nossa própria rede é criada:

docker network inspect mynet

Insira a descrição da imagem aqui

Inicie o contêiner com a rede criada:

docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat

Visualize a rede criada novamente:

docker network inspect mynet

Insira a descrição da imagem aqui

Neste momento, os dois contêineres podem ser pingados

docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-01 --net mynet tomcat

Os dois contêineres podem executar ping um no outro!

8. Conectividade de rede

Não há intercomunicação entre contêineres baseados em docker0 e contêineres baseados em mynet, então conectividade de rede é necessária, ou tomcat como um exemplo:

docker run -d -P --name tomcat01 tomcat

Agora conecte tomcat01 a mynet

docker network connect mynet tomcat01

Agora verifique mynet

docker network inspect mynet

Insira a descrição da imagem aqui

Um contêiner, 2 IPs, semelhante a um servidor em nuvem, com IP público e IP de intranet

Neste ponto, você pode fazer ping novamente

Insira a descrição da imagem aqui

Mas tomcat02 ainda não consegue fazer ping:

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/dreaming_coder/article/details/113881431
Recomendado
Clasificación