7. Rede Docker

O que o modo de rede docker pode fazer?

Interconexão e comunicação entre containers e mapeamento de portas.Quando
o IP do container muda, a comunicação direta na rede pode ser feita através do nome do serviço sem ser afetada.

O
modo de rede docker adota o modo bridge. Quando criamos um contêiner, a rede docker nos ajuda a criar uma placa de rede virtual. Essa placa de rede virtual corresponde à nossa rede de contêineres um a um (aparece em pares). Todos os contêineres criados por padrão possuem placas de rede docker0.

Após a instalação do Docker, três redes serão criadas por padrão, que podem ser visualizadas através do docker network ls

[root@test ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
6f24f7cbfa10   bridge    bridge    local
2dc34a1c0f04   host      host      local
80147a6b6933   none      null      local

O Docker fornece vários modos de rede para gerenciar a comunicação entre contêineres e conexões com redes externas. Aqui estão vários padrões de rede comuns e seus princípios:

Modo Bridge (Bridge): O modo Bridge é o modo de rede padrão do Docker. No modo bridge, o Docker cria uma interface de rede virtual para cada contêiner e conecta essas interfaces por meio de um switch virtual. Os contêineres podem se comunicar entre si e se conectar à rede externa por meio da interface de rede do host.
Modo Host (Host): No modo host, o contêiner e o host compartilham a pilha de rede, ou seja, o contêiner usa a interface de rede e o endereço IP do host. Isso significa que o contêiner pode usar diretamente os recursos de rede do host, mas também pode levar a conflitos de porta e riscos de segurança.
Sem modo de rede (Nenhum): No modo sem rede, o contêiner não possui interface de rede e conexão e só pode se comunicar com outros contêineres. Este modo é adequado para algumas necessidades especiais, como situações em que é necessária apenas a comunicação entre contêineres e nenhuma conexão com a rede externa.
Modo de rede de sobreposição (Overlay): O modo de rede de sobreposição é usado para criar uma rede virtual entre vários hosts Docker, e os contêineres podem se comunicar entre hosts. Esse padrão é frequentemente usado para construir aplicativos distribuídos ou clusters de contêineres.
Esses modos de rede podem ser selecionados e configurados de acordo com as necessidades reais para atender às necessidades de comunicação entre contêineres e entre contêineres e redes externas.
Insira a descrição da imagem aqui

- bridge模式:使用--network  bridge指定,默认使用docker0
- host模式:使用--network host指定
- none模式:使用--network none指定
- container模式:使用--network container:NAME或者容器ID指定

Regras de produção de IP de rede padrão em instâncias de contêiner
Primeiro, inicie duas instâncias de contêiner do Ubuntu

[root@test ~]# docker run -it --name u1 ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
3153aa388d02: Pull complete 
Digest: sha256:0bced47fffa3361afa981854fcabcd4577cd43cebbb808cea2b1f33a3dd7f508
Status: Downloaded newer image for ubuntu:latest
root@ab3aff38e17c:/# ^C
root@ab3aff38e17c:/# exit
exit
[root@test ~]# docker run -it --name u2 ubuntu bash
root@53685573c8cd:/# exit
exit

$ docker inspect 容器ID or 容器名字
[root@test ~]# docker start u1
u1
[root@test ~]# docker inspect u1| tail -n 20
            "Networks": {
    
    
                "bridge": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "6f24f7cbfa10048e76b574ec90900abadf9fefbe49a2df57f356d43cecdaf33a",
                    "EndpointID": "60b9e3c0386bdbc7779b66a27b3d2f0e06136081cb9eae7a99801ae9d0a8707b",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@test ~]# docker start u2
u2
[root@test ~]# docker inspect u2| tail -n 20
            "Networks": {
    
    
                "bridge": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "6f24f7cbfa10048e76b574ec90900abadf9fefbe49a2df57f356d43cecdaf33a",
                    "EndpointID": "4ac287832bd590e3758c60f5beef97e294d16fcc6cded9b2c3ffbc30a0a02429",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

Feche a instância u2, crie um novo u3 e verifique as alterações de IP

[root@test ~]# docker run -it --name u3 ubuntu bash
root@db76ae3a6f5d:/# exit
exit
[root@test ~]# docker start u3
u3
[root@test ~]# docker inspect u3| tail -n 20
            "Networks": {
    
    
                "bridge": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "6f24f7cbfa10048e76b574ec90900abadf9fefbe49a2df57f356d43cecdaf33a",
                    "EndpointID": "c67f166e2c399d62ada2d58a7a274f161378aa0a9c9c352e7907c3f2a7f8df45",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

O IP dentro do contêiner docker pode mudar

Modo de rede Bridge
O serviço Docker criará uma ponte docker0 por padrão (há uma interface interna docker0 nela). O nome da rede bridge é docker0. Ela conecta outras placas de rede físicas ou virtuais na camada do kernel, que conecta todos os contêineres e local Os hosts são todos colocados na mesma rede física. O Docker especifica o endereço IP e a máscara de sub-rede da interface docker0 por padrão, permitindo que o host e o contêiner se comuniquem entre si por meio de uma ponte de rede.

Neste modo, o daemon Docker cria uma ponte Ethernet virtual docker0. O contêiner recém-criado fará a ponte automaticamente para esta interface e os pacotes de dados podem ser encaminhados automaticamente entre quaisquer placas de rede conectadas a ele.

Por padrão, o daemon criará um par de interfaces de dispositivos virtuais peer veth pair, definirá uma das interfaces para a interface eth0 do contêiner (a placa de rede do contêiner) e colocará a outra interface no namespace do host, semelhante a vethxxx Nomeie-o assim que todos os contêineres no host estejam conectados a esta rede interna

Execute um contêiner bbox01 construído com base na imagem do busybox e verifique o endereço IP:

[root@test ~]# docker run -it --name bbox01 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
809d8e20e203: Pull complete 
Digest: sha256:2376a0c12759aa1214ba83e771ff252c7b1663216b192fbe5e0fb364e952f85c
Status: Downloaded newer image for busybox:latest
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

O daemon também atribui um endereço IP e uma sub-rede ao contêiner a partir do espaço de endereço privado da ponte docker0 e define o endereço IP do docker0 como o gateway padrão do contêiner. Você também pode instalar yum install -y bridge-utils e posteriormente usar o comando brctl show para visualizar as informações da ponte.

[root@test ~]# yum install -y bridge-utils
[root@test ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02428fef6e06	no		veth155aaec
							vethad8699e
							vethc94dda7
							vethda06ae9
							vethded9001

Para o endereço IP e informações de gateway de cada contêiner, podemos visualizá-los por meio do docker inspecionar nome do contêiner | ID, e informações detalhadas podem ser vistas no nó NetworkSettings

[root@test ~]# docker network inspect bridge
[
    {
    
    
        "Name": "bridge",
        "Id": "6f24f7cbfa10048e76b574ec90900abadf9fefbe49a2df57f356d43cecdaf33a",
        "Created": "2023-07-11T07:22:15.715138449Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
    
    
            "Driver": "default",
            "Options": null,
            "Config": [
                {
    
    
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
    
    
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
    
    
            "19d14c2fdb62b0b30e33e9fa5f95813ae949cdba450f3b942a152cbf03ad9b45": {
    
    
                "Name": "db1",
                "EndpointID": "c230a062220ca20aca60fbe4d5f987eb4c6909f6967b918f51ac31cd1620f613",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "2715db54f63af6991cf200dd25ec8bb035ad367c98994abd054727b831e61edb": {
    
    
                "Name": "bbox01",
                "EndpointID": "5801b8ff13e9adabb55a39fd5cb3d6d8124af807311f10bf05f842c621952637",
                "MacAddress": "02:42:ac:11:00:06",
                "IPv4Address": "172.17.0.6/16",
                "IPv6Address": ""
            },
            "3f2d71eecb6cd747ce694ecaa4bab58a22360886002837ea65f2659cd61119d6": {
    
    
                "Name": "db3",
                "EndpointID": "a2630ab3ef3836884fe855cbd99af08fabab7424134bfa67e886329db4a45430",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            },
            "6fad6aa97b03adf3a613e5109792c0c1d35f0d076ea9a097d3f645d54139eec9": {
    
    
                "Name": "db2",
                "EndpointID": "a74cc32c585de49e1799311dd74791070b4fce3a1c8ad06c57a27de6363593fd",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "9b45a8a658434d43a73857ab3d3f98bfaaeb8b9bc4b15a20bcfbba74ff6b3439": {
    
    
                "Name": "dbdata",
                "EndpointID": "fb6974276d93659c2bbaaf9cb74e51a4a120970ff842f0d52295a272ccd7129e",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
    
    
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {
    
    }
    }
]

Bridge explica que o
Docker usa ponte Linux para virtualizar uma ponte de contêiner Docker (docker0) no host.Quando o Docker inicia um contêiner, ele atribuirá um endereço IP ao contêiner com base no segmento de rede da ponte Docker, chamado Container-IP. Ao mesmo tempo, a ponte Docker é o gateway padrão para cada contêiner. Como os contêineres no mesmo host estão todos conectados à mesma ponte de rede, os contêineres podem se comunicar diretamente por meio do Container-IP do contêiner.

Quando o docker é executado, se a rede não for especificada, o modo de ponte padrão usado é bridge e o docker0 é usado. No host ifconfig, você pode ver docker0 e a rede que você criou (discutida mais tarde) eth0, eth1, eth2... representam placa de rede um, placa de rede dois, placa de rede três..., lo representa 127.0.0.1, que é localhost, inet addr é usado para representar o endereço IP da placa de rede

Bridge docker0 cria um par de interfaces de dispositivos virtuais peer, uma chamada veth e a outra chamada eth0, combinando em pares.

O modo bridge de todo o host é docker0, que é semelhante a um switch com várias interfaces. Cada interface é chamada veth. Crie uma interface virtual no host local e no contêiner, respectivamente, e deixe-os se comunicarem entre si (como um par de interfaces é chamado veth pair);
Cada instância de contêiner também possui uma placa de rede interna, e cada interface é chamada eth0; Cada
veth no docker0 corresponde ao eth0 dentro de uma determinada instância de contêiner, emparelhado em pares e combinado um por um.
Insira a descrição da imagem aqui

Através do acima exposto, todos os contêineres no host estão conectados a esta rede interna. Se dois contêineres estiverem na mesma rede, cada um deles receberá seu IP atribuído deste gateway. Neste momento, as redes dos dois contêineres são interoperáveis.

Visualize todos os contêineres no modo de rede bridge. Você pode ver o nome do contêiner no nó Containers.

Em relação ao uso do modo de rede bridge, você só precisa especificá-lo através do parâmetro --net bridge ou --network bridge ao criar um contêiner. Claro, este também é o modo de rede padrão usado ao criar um contêiner, o que significa que este parâmetro pode ser omitido.

As principais etapas para implementar o modo Bridge Bridge são as seguintes:

Docker Daemon usa a tecnologia veth pair para criar um par de dispositivos de interface de rede virtual peer na máquina host, assumindo veth0 e veth1. As características da tecnologia de par veth podem garantir que, independentemente de qual veth receba uma mensagem de rede, ele transmitirá a mensagem para a outra parte.
Docker Daemon anexa veth0 à ponte docker0 criada pelo Docker Daemon. Certifique-se de que os pacotes de rede do host possam ser enviados para veth0;
Docker Daemon adiciona veth1 ao namespace ao qual o Docker Container pertence e é renomeado como eth0. Desta forma, se a mensagem de rede do host for enviada para veth0, ela será imediatamente recebida pela eth0 do Container, realizando a conectividade entre o host e a rede Docker Container; ao mesmo tempo, também garante que o Docker Container utilize eth0 sozinho para realizar o ambiente de rede de contêineres.

Modo de rede host
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 e usará o IP e a porta do host.

docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

# 查看容器实例内部
[root@test ~]# docker inspect tomcat83 | tail -n 20
            "Networks": {
    
    
                "host": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "2dc34a1c0f045de9d4f92334e27325912f47f228de3c9ed680385bf1247a4b48",
                    "EndpointID": "bc0c47dab8947cb1d0667b30dc4cecaa836c1a8f4ce4e429cb0fea9a86b48d9a",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

Não há mapeamento de porta -p definido. Como acessar o Tomcat83 iniciado?

http://IP do host:8080/

[root@test ~]# curl http://127.0.0.1:8080

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.0.53</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>
    ...

Portanto, o contêiner compartilha o IP da rede do host. A vantagem disso é que o host externo e o contêiner podem se comunicar diretamente.

Nenhum modo de rede
No modo nenhum, nenhuma configuração de rede é executada para o contêiner Docker. Ou seja, esse contêiner Docker não possui placa de rede, IP, roteamento e outras informações, apenas um lo. Precisamos adicionar placas de rede, configurar IP, etc. ao contêiner Docker.

Desative as funções de rede, apenas o logotipo (ou seja, 127.0.0.1 significa loopback local)

[root@test ~]# docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
bca3fd1c4a6502e30154c4de69d3ce2cfba3fe39480fd99c4e266f0072a56fe6
[root@test ~]# docker inspect tomcat84 | tail -n 20
            "Networks": {
    
    
                "none": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "80147a6b6933fe9d3a6b15fb75e671f1c011b9fc3e06dc8622e49e5ed28e8df5",
                    "EndpointID": "005a23aae4e1a74128f4dd1fbf97af1b80cae21f0ffc1d715fee8e049602fe1f",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

Modo de rede de contêiner:
O novo contêiner compartilha uma configuração IP de rede com um contêiner existente em vez de compartilhá-la 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, intervalo de portas, etc. com um contêiner especificado. Da mesma forma, além da rede, os dois contêineres também estão isolados em outros aspectos, como sistemas de arquivos, listas de processos, etc.

Insira a descrição da imagem aqui
Modo de rede personalizado

Personalize a rede de ponte. A rede personalizada usa a rede de ponte por padrão.

Os administradores podem usar drivers de rede Docker (bridge, overlay, macvlan) ou plug-ins de driver de rede de terceiros para criar uma rede personalizada e, em seguida, conectar vários contêineres à mesma rede personalizada.

Características:

Os contêineres conectados a uma rede definida pelo usuário podem se comunicar entre si usando endereços IP ou nomes.
Você pode criar quantas redes personalizadas precisar.
Os contêineres podem ser conectados a essas redes a qualquer momento.
Para executar contêineres, você pode conectar-se e desconectar-se de redes personalizadas sem reiniciar o contêiner.
Rede de ponte definida pelo usuário (rede personalizada usa driver de rede de ponte): comumente usada em ambiente autônomo. Recomendado para ambientes de produção.

Não é recomendado usar a rede de ponte padrão em um ambiente de produção. É recomendado usar uma rede de ponte definida pelo usuário pelos seguintes motivos:

Redes de pontes definidas pelo usuário podem fornecer melhor isolamento e interoperabilidade entre aplicativos em contêineres. Se a pilha de aplicativos estiver em execução na rede em ponte padrão, o host Docker precisará restringir o acesso às portas por outros meios.
As redes de ponte definidas pelo usuário fornecem resolução automática de DNS entre contêineres e podem acessar uns aos outros por meio de nomes ou apelidos. Por padrão, os contêineres em uma rede em ponte só podem acessar uns aos outros por meio de endereços IP.
Os contêineres podem se conectar e desconectar de redes definidas pelo usuário em tempo de execução. Para se desconectar da rede bridge padrão, é necessário parar o contêiner e recriá-lo com diferentes opções de rede.
Cada usuário pode criar uma ponte configurável através de uma rede personalizada. A rede de ponte padrão criará automaticamente uma ponte virtual chamada docker0.
Os contêineres conectados em uma rede definida pelo usuário não podem compartilhar variáveis ​​de ambiente, mas existem maneiras melhores de obter variáveis ​​de ambiente compartilhadas (montagem de volume do docker, definição de arquivo de composição, clustering). Os contêineres conectados na rede de ponte padrão compartilham variáveis ​​de ambiente.

O ping de acordo com o endereço IP está OK, mas o ping de acordo com o nome do serviço falha. A solução é personalizar a rede.

Etapas:
Personalize a rede bridge. A rede personalizada usa a rede bridge por padrão. O Bridge
cria uma nova rede personalizada.

docker network create xigua_network 

Crie um novo contêiner e junte-se à rede personalizada criada na etapa anterior

docker run -d -p 8081:8080 --xigua_network   --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --xigua_network   --name tomcat82 billygoo/tomcat8-jdk8

A própria rede personalizada mantém o relacionamento correspondente entre o nome do host e o IP (tanto o IP quanto o nome de domínio podem ser conectados)

Do ponto de vista de sua arquitetura e processo operacional, Docker é uma arquitetura de modelo C/S, e o backend é uma arquitetura fracamente acoplada, com muitos módulos executando suas próprias funções.

O processo básico de operação do Docker é:

1 O usuário utiliza o Docker Client para estabelecer comunicação com o Docker Daemon e enviar solicitações a este último.
2 Docker Daemon, como parte principal da arquitetura Docker, primeiro fornece a função de Docker Server para que possa aceitar solicitações do Docker Client.
3 O Docker Engine executa uma série de tarefas dentro do Docker, e cada tarefa existe na forma de um Job.
4 Durante a execução do Job, quando uma imagem de contêiner é necessária, a imagem é baixada do Docker Registry e a imagem baixada é armazenada na forma de Graph por meio do driver de gerenciamento de imagem Graph driver.

Acho que você gosta

Origin blog.csdn.net/weixin_45817985/article/details/133385518
Recomendado
Clasificación