Conecte o contêiner do Docker à rede de host e de ponte interna

14

Estou tentando executar um contêiner do Docker como um roteador entre uma --internalrede privada ( ) do Docker e a hostrede predefinida . Isso significa que o contêiner precisa ter duas interfaces de rede: uma interface "externa", que pode acessar todos os endereços IP do host, e uma interface "interna", que atua como um gateway para os contêineres na rede interna do Docker

O próprio contêiner do roteador irá então trafegar na rede NAT de / para contêineres.

Não encontrei uma maneira de configurar o Docker para executar o contêiner com essas duas interfaces. O mais próximo que pude chegar foi ter duas bridgeinterfaces atribuídas, o que não é exatamente o que eu preciso.

Tentar conectar manualmente resulta em um erro:

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

Alguém pode me mostrar como conseguir isso, de preferência mesmo com o Docker Compose?

Hexaholic
fonte
@PunMum Infelizmente não. Acabamos conectando todos os contêineres diretamente à rede host e configurando os IPs dentro dos contêineres.
Hexaholic

Respostas:

2

De acordo com as perguntas e respostas no github :

A rede host é especial. Você precisa usar o network_mode: host no serviço

030
fonte
A network_modenão funciona se você precisa de algo ligado a uma rede interna ea rede do host. Parece insano que não possamos encontrar uma boa solução clara para esse problema.
jv-dev
2

O Docker não permite conectar um contêiner à rede host e a qualquer outra rede de ponte do Docker ao mesmo tempo. Vou tentar ilustrar o motivo com um exemplo:

  • Vamos pensar em um contêiner C1. Hipoteticamente, C1 seria conectado à rede host (--net = host) e a uma rede de ponte Docker Br1 (--net = Br1).
  • Um segundo contêiner, digamos C2, está conectado ao Br1.

Com a configuração acima, meu palpite é que a rede host é visível a partir do C2, e suponho que essa seja a razão pela qual o Docker nos impede automaticamente de expor acidentalmente a rede host a contêineres não especificados pelo host.

Dito isto, se tivermos um conjunto de contêineres e desejarmos que todos eles sejam interconectados, com apenas um único contêiner tendo acesso à rede host, minha abordagem seria:

  • [C2, ..., CN] estão conectados a uma ponte do Docker definida pelo usuário Br1 (--net = Br1)
  • C1 está conectado à rede host (--net = host)
  • C1 expõe uma porta para ser acessível a partir do restante dos contêineres

EDIT: ainda precisaríamos adaptar as políticas do iptables de forma que o C1 possa ser acessado do restante dos contêineres (consulte https://docs.docker.com/network/iptables/ )

JJFanFer
fonte