Como fazer com que o docker NÃO use uma sub-rede como rede de ponte ou inclua uma exceção de roteamento

2

Eu tenho um host de encaixe (CentOs7) em que estou executando vários aplicativos dockerized e teremos ainda mais no futuro. O problema que eu tenho um serviço externo que eu preciso acessar a partir do host, que usa um endereço 172.18.100.101.

O Docker atribui automaticamente sub-redes para as redes de bridge criadas por ele, 172.18.x, 172.19.x, etc:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3df38b5c
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

As opções que vejo:
1. Diga ao Docker para NÃO usar a sub-rede 172.18.0.0 para as pontes. Eu não acho que isso é possível no docker.
2. Para cada contêiner do Docker eu poderia começar a especificar uma sub-rede - mas isso se torna muito problemático, já que você precisa garantir que eles não colidam, além dos arquivos docker-compose.yml serem compartilhados entre os hosts, então esse é um pesadelo de gerenciamento. br> 3. Tente rotear o ip necessário (172.18.100.101) de forma diferente no host - enquanto a sub-rede 172.18.0.0 ainda estiver lá. Não tenho certeza se isso é possível. Eu tentei com adicionar rotas, mas não ajuda, provavelmente porque é adicionado após a regra 172.18.0.0 e não antes.

$ sudo route add -host 172.18.100.101 dev eth0
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3dfsudo ip route show to match 172.18.198.12038b5c
172.18.100.101  0.0.0.0         255.255.255.255 UH    0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

Alguma ideia? Eu acho que a questão é como adicionar um roteamento de "exceção" para um ip (ou sub-rede) de seleção e certifique-se de que ele é aplicado antes da regra principal.

EDIT (2018-06-21): O problema não é tentar conectar um serviço em um contêiner do Docker. Meu problema é que na minha rede há um serviço (em um servidor diferente, não possuído / controlado por mim) com ip 172.18.100.101, mas não consigo me conectar a este serviço a partir deste host, como neste host Docker atribui automaticamente o 172.18 .0.0 intervalo para uma rede de ponte que cria, portanto, qualquer tentativa de conexão para 172.18.100.101 é enviada para ponte Docker criado e não para esse host externo.

    
por Zoltan Fedor 20.06.2018 / 18:40

2 respostas

2

A rede do Docker bridge é apenas uma das várias opções para configurar a rede. A documentação da rede do Docker lista muitos plugins de rede diferentes que você pode usar para comunicações com containers.

Se você só precisa se conectar a um serviço em um contêiner do Docker, mexer com a rede é um pouco exagerado, já que é possível abrir uma porta de serviço no host conectado à porta no Docker. O Docker chama isso de "portas de publicação" e é usado no comando docker run com o sinalizador --publish ou -p . Não deve haver necessidade de se conectar diretamente a um contêiner Docker.

No entanto, se você quiser se conectar diretamente ao contêiner, o Docker certamente permitirá que você configure isso.

EDIT: eu não entendi a pergunta original era sobre roteamento de host.

Em relação ao roteamento de host, o Docker permite que você altere os intervalos de rede utilizados. Se você está usando docker para criar suas redes, você pode configurar o docker0 interface para o intervalo desejado, escolha um que não esteja em uso na sua rede.

Se você usar docker-compose para criar as redes, precisará configurar os intervalos de rede no arquivo docker-compose.yml para esse projeto.

    
por 21.06.2018 / 02:06
0

As rotas com prefixos maiores (como sua rota de host 172.18.100.101 ) terão prioridade mais alta que as rotas com prefixo menor (como as rotas / 16 adicionadas pela janela de encaixe). Então, sua abordagem inicial deve funcionar. No entanto, a menos que 172.18.100.101 esteja diretamente acessível em eth0 , você precisará especificar um gateway para ele também.

por exemplo:

ip route add 172.18.100.101/32 via 10.x.x.x dev eth0

    
por 16.12.2018 / 00:06