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 |
|
---|---|
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 ls
comando para listar essas redes:
O Docker construiu essas três redes, ao executar o contêiner, você pode usar este –network
sinalizador 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=XXX
opção e especifique o contrário, o daemon padrão do Docker se conectará a este contêiner de rede.
Usamos docker run
ao criar um contêiner do Docker, você pode usar --net
o 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=host
especificado - modo nenhum: use para
--net=none
especificar - modo de ponte: use
--net=bridge
as configurações padrão especificadas - modo de contêiner: uso
--net=container:NAME_or_ID
especificado
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 .
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 addr
comando 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:
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:
-
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.
-
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
-
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
docker inspect nginx_bridge
docker network inspect bridge
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?
Podemos usar --link
para resolver
docker run -d -P --name tomcat03 --link tomcat02 tomcat
No entanto, essa conexão é unilateral:
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
Nossa própria rede é criada:
docker network inspect mynet
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
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
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
Mas tomcat02 ainda não consegue fazer ping: